Node.JS 和 Express 中的安全性:最低限度 - 第 1 部分。
我们将在本文中介绍
服务器端 JS 注入
使用严格
头盔
更改默认错误页面
适当的会话管理
就这些了(目前为止……)
Node.JS 是开发应用程序后端最著名的框架之一。然而,这并不意味着它不存在许多漏洞,开发人员应该注意并采取措施来消除这些漏洞。
我们将在本文中介绍
服务器端 JS 注入
也称为SSJS。用户输入直接通过原生 JS 函数(例如、或)
传递的情况。这些函数允许客户端在服务器端执行恶意 JavaScript 代码。这些代码可能是终止服务器的命令,也可能是文件系统调用。因此,我们应该不惜一切代价避免使用这些函数。即使我们验证并清理了用户输入数据,这些函数仍然是一种不良做法。为了防止这种情况,只需使用,这样更安全。eval()
setTimeout()
setInterval()
Function()
process.exit()
JSON.parse()
使用严格
"Use strict"
literal 必须在 Node.JS 应用程序的每个 JS 脚本顶部声明。它启用了“严格模式”,该模式不允许某些操作,例如使用未声明的变量(例如x = 5.2
),删除对象、变量、函数等。它还限制了eval()
用例和可能的漏洞利用。
头盔
Helmet是一个 npm 包(您可以通过输入 来安装npm i helmet
),它可以设置各种 HTTP 标头,如果保留默认值,这些标头可能会构成威胁。它不仅设置Content-Security-Policy
标头,还允许开发人员将X-Powered-By
标头设置为非默认值,这样入侵者就无法感知服务器上运行的应用程序背后的真实堆栈。最后,它还可以保护您免受点击劫持等一系列攻击,并禁用客户端缓存。
更改默认错误页面
如果我们保留 Express 的默认错误页面,则没有必要隐藏X-Powered-By
header,因为入侵者仍然可以知道我们的服务器运行在 Express 上。我们可以按照以下代码片段所示进行操作:
// Handle 404
app.use(function(req, res) {
res.status(400);
res.render('404', {title: '404: File Not Found'});
});
// Handle 500
app.use(function(error, req, res, next) {
res.status(500);
res.render('500', {title:'500: Internal Server Error', error: error});
});
适当的会话管理
会话管理也可能构成潜在威胁。
我们使用的 Express Cookie 应始终将以下两个属性设置为true
:
1) httpOnly
2)secure
第一个属性可防止浏览器 JS 脚本访问 Cookie,第二个属性可强制 Cookie 只能通过安全的 HTTPS 连接进行配置。
正确的 Cookie 设置如下代码片段所示:
app.use(express.cookieParser());
app.use(express.session({
secret: "s3Cur3",
cookie: {
httpOnly: true,
secure: true
}
}));
ephemeral
cookie 属性对于安全性也非常有用,因为它会在浏览器关闭时删除 cookie(如果设置为true
)。因此,它对于在公共计算机上访问的应用程序非常有用。
最后,我们应该始终在注销时销毁会话和 cookie。
例如:
req.session.destroy(function() {
res.redirect("/");
});
就这些了(目前为止……)
希望您觉得本文有趣,并能帮助您构建更安全、更强大的 Node.JS 和 Express 应用。
下一部分我们将介绍 XSS 攻击、SQL 和 No-SQL 注入以及正则表达式拒绝服务攻击。
第 2 部分也可在以下链接中找到: