Node.JS 和 Express 中的安全性:最低限度 - 第 2 部分。一般的 XSS 攻击、一般的 SQL 注入、RegEx 拒绝服务,就这些了(目前……)

2025-06-08

Node.JS 和 Express 中的安全性:最低限度 - 第 2 部分。

常见的 XSS 攻击

SQL注入概述

RegEx 拒绝服务

就这些了(目前为止……)

在上一部分中,我们介绍了

  • 服务器端 JS 注入
  • “使用严格”
  • 头盔
  • 更改默认错误页面
  • 适当的会话管理

在本部分中,我们将介绍

  • XSS攻击
  • SQL注入
  • RegEx 拒绝服务

常见的 XSS 攻击

XSS 攻击(即跨站脚本攻击)允许入侵者在受害者的浏览器中执行脚本。通过这种方式,他们可以访问 Cookie、会话令牌和其他敏感信息,或将用户重定向到恶意网站。这是入侵者控制网页的最常见方法之一。

示例:
假设我们有以下注册表单,它将数据发送到我们的 Express 服务器:
典型的注册表单

如果我们不采取任何措施,‘alert(document.cookie)’将保存在我们数据库后端的用户名字段中,当我们将来获取并呈现特定用户的用户名时,用户将看到以下警报。

Cookie 警报

可以想象,此漏洞可能造成灾难性的后果,因为它可能会泄露关键信息和数据。实际上,一些最著名的网络攻击都是利用此漏洞进行的。一个典型的例子是2014年针对Twitter的攻击

XSS 攻击 - 如何预防

我们可以采取多种措施来保护 Express 服务器免受 XSS 攻击。首先,我们应该始终执行数据验证和清理。这意味着,对于每个传入的请求,我们都应该检查用户提供的输入参数是否采用正确的格式,即服务器和数据库期望的格式。另一个有用的技巧是将 cookiehttpOnly值设置为,true因为它可以防止浏览器 JS 脚本访问 cookie。

app.use(express.session({
    secret: "s3Cur3",
    cookie: {
        httpOnly: true,
        secure: true
    }
})
Enter fullscreen mode Exit fullscreen mode

此外,在将数据插入 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
});
Enter fullscreen mode Exit fullscreen mode

如果恶意用户在用户名和密码字段中输入“或“”=”会怎么样?
我们准备执行的 SQL 查询将如下所示:

SELECT * FROM Users WHERE Name ="" or ""="" AND Pass ="" or ""="" 
Enter fullscreen mode Exit fullscreen mode

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);
Enter fullscreen mode Exit fullscreen mode

在安全性方面比字符串连接的 SQL 查询要好得多。

RegEx 拒绝服务

某些正则表达式对于某些输入可能“不安全”,即(a+)+正则表达式对于输入是不安全的aaaaaaaaaaaaaaaaaaaaa!,因为它会导致正则表达式评估达到指数时间复杂度,从而导致服务器拒绝服务。

幸运的是,有一个 NPM 包可以帮助我们检测易受攻击的正则表达式,它被称为“safe-regex”,
它的使用方式如下:

var safe = require(safe-regex);
var regex = new RegExp((a+)+);
console.log(safe(regex));
Enter fullscreen mode Exit fullscreen mode

它将返回一个布尔值,指示正则表达式是否安全。

就这些了(目前为止……)

希望您觉得本文有趣,并能帮助您构建更安全、更强大的 Node.JS 和 Express 应用。
下一部分我们将介绍跨站请求伪造、速率限制和数据清理。

鏂囩珷鏉ユ簮锛�https://dev.to/demetrakopetros/security-in-node-js-and-express-the-bare-minimum-part-2-ll4
PREV
如何使用 NodeJS 构建命令行工具 - 分步指南
NEXT
TypeScript 简介