Node.JS 和 Express 中的安全性:最低限度 - 第 2 部分。
常见的 XSS 攻击
SQL注入概述
RegEx 拒绝服务
就这些了(目前为止……)
在上一部分中,我们介绍了
- 服务器端 JS 注入
- “使用严格”
- 头盔
- 更改默认错误页面
- 适当的会话管理
Node.JS 和 Express 中的安全性:最低限度 - 第 1 部分。
Petros Demetrakopoulos ・ 20年4月6日
在本部分中,我们将介绍
- XSS攻击
- SQL注入
- RegEx 拒绝服务
常见的 XSS 攻击
XSS 攻击(即跨站脚本攻击)允许入侵者在受害者的浏览器中执行脚本。通过这种方式,他们可以访问 Cookie、会话令牌和其他敏感信息,或将用户重定向到恶意网站。这是入侵者控制网页的最常见方法之一。
示例:
假设我们有以下注册表单,它将数据发送到我们的 Express 服务器:
如果我们不采取任何措施,‘alert(document.cookie)’将保存在我们数据库后端的用户名字段中,当我们将来获取并呈现特定用户的用户名时,用户将看到以下警报。
可以想象,此漏洞可能造成灾难性的后果,因为它可能会泄露关键信息和数据。实际上,一些最著名的网络攻击都是利用此漏洞进行的。一个典型的例子是2014年针对Twitter的攻击。
XSS 攻击 - 如何预防
我们可以采取多种措施来保护 Express 服务器免受 XSS 攻击。首先,我们应该始终执行数据验证和清理。这意味着,对于每个传入的请求,我们都应该检查用户提供的输入参数是否采用正确的格式,即服务器和数据库期望的格式。另一个有用的技巧是将 cookiehttpOnly
值设置为,true
因为它可以防止浏览器 JS 脚本访问 cookie。
app.use(express.session({
secret: "s3Cur3",
cookie: {
httpOnly: true,
secure: true
}
})
此外,在将数据插入 HTML 元素之前,我们应始终进行 HTML 转义(例如:将 & 转换为 &,将 < 转换为 < 等)。这可能会消除一些 XSS 威胁。我们也应该对 HTML 上下文中呈现的 JSON 值执行此操作,并使用 读取数据JSON.parse()
。
最后,我们应该使用“XSS” npm 包,它可以执行上述许多应对措施。
SQL注入概述
假设在登录端点中,我们以以下方式接收用户的用户名和密码(为了简化情况,我们假设没有执行密码哈希策略)。
app.post('/login', function (req, res) {
var username = req.body.username;
var password = req.body.password;
var sql = 'SELECT * FROM Users WHERE Name ="' + username+ '" AND Pass ="' + password + '"'
// and then executing the query in our SQL databse
});
如果恶意用户在用户名和密码字段中输入“或“”=”会怎么样?
我们准备执行的 SQL 查询将如下所示:
SELECT * FROM Users WHERE Name ="" or ""="" AND Pass ="" or ""=""
OR ""=""
条件始终为真!
因此查询返回“用户”表的所有行。
SQL注入——如何预防
再次强调,数据验证和清理是消除这些威胁的最佳方法。像sqlstring这样的 NPM 包会转义用户输入值,从而使恶意用户很难利用该漏洞。此外,像sql-query-builder这样的包可以让你以更结构化的方式创建 SQL 查询,例如
query().select([users.id.as('User'), users.id.count(1)])
.from(users).join(posts)
.on(posts.user_id).equals(users.id)
.groupBy(users.id);
在安全性方面比字符串连接的 SQL 查询要好得多。
RegEx 拒绝服务
某些正则表达式对于某些输入可能“不安全”,即(a+)+
正则表达式对于输入是不安全的aaaaaaaaaaaaaaaaaaaaa!
,因为它会导致正则表达式评估达到指数时间复杂度,从而导致服务器拒绝服务。
幸运的是,有一个 NPM 包可以帮助我们检测易受攻击的正则表达式,它被称为“safe-regex”,
它的使用方式如下:
var safe = require(‘safe-regex’);
var regex = new RegExp(‘(a+)+’);
console.log(safe(regex));
它将返回一个布尔值,指示正则表达式是否安全。
就这些了(目前为止……)
希望您觉得本文有趣,并能帮助您构建更安全、更强大的 Node.JS 和 Express 应用。
下一部分我们将介绍跨站请求伪造、速率限制和数据清理。