📜  csurf in express - Javascript (1)

📅  最后修改于: 2023-12-03 15:00:10.190000             🧑  作者: Mango

使用 csurf 来加强 Express 应用程序的安全性

什么是 csurf?

csurf 是一个通过检查 HTTP 请求中的 CSRF 标记来增强 Web 应用安全性的中间件。

为什么要使用 csurf?

如果不加入 CSRF 防御机制,攻击者可以通过跨站点请求伪造攻击(CSRF)来伪造用户身份,并以此为基础窃取用户信息和执行恶意操作。

如何在我的 Express 应用程序中使用 csurf?
  1. 安装 csurf 模块

使用 npm 安装 csurf 模块:

npm install csurf
  1. 在应用程序中使用 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 模块所需的。

  1. 将 CSRF 令牌包含到应用程序的响应中

当客户端获取应用程序的某个表单时,您必须将 CSRF 令牌打包在表单中。这可以通过在模板文件中使用 CSRF 中间件的辅助函数 csrfToken() 来完成:

app.get('/form', function(req, res) {
  res.render('send', { csrfToken: req.csrfToken() });
});

在此示例中,当用户访问“/form”页面时,使用 csrfToken() 生成 CSRF 令牌,并将其作为对象 req.session 中的 csrfSecret 属性(存储csrf令牌的密钥)的一部分传递到“send”模板中。

  1. 验证每个请求的 CSRF 令牌

最后,您需要在每次进行 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 应用程序更加安全,更难受到攻击者的攻击。