📅  最后修改于: 2023-12-03 15:00:10.190000             🧑  作者: Mango
csurf 是一个通过检查 HTTP 请求中的 CSRF 标记来增强 Web 应用安全性的中间件。
如果不加入 CSRF 防御机制,攻击者可以通过跨站点请求伪造攻击(CSRF)来伪造用户身份,并以此为基础窃取用户信息和执行恶意操作。
使用 npm 安装 csurf 模块:
npm install csurf
const express = require('express');
const cookieParser = require('cookie-parser');
const csrf = require('csurf');
const app = express();
// 引入 cookie-parser 和 csurf 模块
app.use(cookieParser());
// 使用 csurf 中间件
app.use(
csrf({
cookie: true,
})
);
在此示例中,csurf 中间件被添加到 express 应用程序中,并将从发送请求的客户端中自动解析出 CSRF 令牌,并将其存储在 req.session.csrfSecret 属性下。请注意,上面的示例也使用了 cookie-parser 以解析存储在用户浏览器中的 Cookie,这是 csrf 模块所需的。
当客户端获取应用程序的某个表单时,您必须将 CSRF 令牌打包在表单中。这可以通过在模板文件中使用 CSRF 中间件的辅助函数 csrfToken() 来完成:
app.get('/form', function(req, res) {
res.render('send', { csrfToken: req.csrfToken() });
});
在此示例中,当用户访问“/form”页面时,使用 csrfToken() 生成 CSRF 令牌,并将其作为对象 req.session 中的 csrfSecret 属性(存储csrf令牌的密钥)的一部分传递到“send”模板中。
最后,您需要在每次进行 POST、PUT 或 DELETE 请求时验证来自客户端发起的令牌。这是在 Express 中应用 csurf 的最后一步,通常比添加它更简单:
app.post('/submit', function(req, res) {
res.send('Data is being processed.');
});
在此示例中,除了代表应用程序接受 POST 请求并响应提交表单外,其余部分均不包含 CSRF 令牌。但是,如果您查看 req 对象,您会注意到该对象具有您之前在 req.session 中存储的 csrfSecret 属性的副本。
这个值应该已经被 csurf 中间件自动填充了。在接受这个 POST 请求之前,您应该使用 verify() 函数来对来自提交的表单的 CSRF 令牌进行验证:
const csrfProtection = csrf({ cookie: true });
app.post('/submit', csrfProtection, function(req, res) {
res.send('Data is being processed.');
});
在本文中,我们了解了 csurf 中间件是如何增强 Express 应用程序的安全性。您了解到有效地使用这个中间件的方法,包括添加它以及包含 CSRF 令牌的表单和在接受请求之前验证 CSRF 令牌。这将使您的 Express 应用程序更加安全,更难受到攻击者的攻击。