求推荐Nodejs express令牌中间件,用来防止重复提交及表单提交令牌验证

求推荐Nodejs express令牌中间件,用来防止重复提交及表单提交令牌验证

求推荐express令牌中间件,或类似模块,用来防止重复提交及表单提交令牌验证,类似java Struts token 令牌机制。 拜谢各位大神~

4 回复

求推荐Nodejs express令牌中间件,用来防止重复提交及表单提交令牌验证

在Web开发中,防止重复提交和表单提交令牌验证是一个常见的需求。这不仅可以提升用户体验,还能有效避免一些安全问题。在Java的世界里,Struts框架提供了强大的Token机制来解决这些问题。而在Node.js的世界里,也有许多优秀的中间件可以帮助我们实现类似的功能。

推荐使用 csurf 中间件

csurf 是一个非常流行且功能强大的中间件,专门用于处理CSRF(跨站请求伪造)攻击,但它也可以很好地用于生成和验证表单令牌,从而防止重复提交。

安装 csurf

首先,你需要安装 csurf 中间件:

npm install csurf
示例代码

接下来,让我们看看如何在Express应用中使用 csurf 来防止重复提交:

const express = require('express');
const csrf = require('csurf');
const bodyParser = require('body-parser');

const app = express();

// 使用body-parser中间件解析请求体
app.use(bodyParser.urlencoded({ extended: false }));

// 创建csrf保护中间件
const csrfProtection = csrf({ cookie: true });

// 设置视图引擎
app.set('view engine', 'ejs');

// 首页路由,展示表单
app.get('/', csrfProtection, (req, res) => {
  res.render('index', { csrfToken: req.csrfToken() });
});

// 提交表单的路由
app.post('/submit', csrfProtection, (req, res) => {
  // 处理表单数据
  console.log(req.body);
  res.send('Form submitted successfully!');
});

// 启动服务器
app.listen(3000, () => {
  console.log('Server is running on port 3000');
});
解释
  1. 安装 csurf:通过 npm install csurf 安装。
  2. 创建中间件:使用 csrf() 函数创建一个中间件 csrfProtection
  3. 渲染表单:在GET请求中,使用 req.csrfToken() 生成一个CSRF令牌,并将其传递给视图模板。
  4. 处理表单提交:在POST请求中,使用相同的 csrfProtection 中间件来验证表单中的CSRF令牌。如果令牌无效,请求将被终止。
  5. 启动服务器:最后,启动Express服务器监听端口。

通过这种方式,你可以有效地防止重复提交和CSRF攻击,同时保持代码的简洁和清晰。希望这对大家有所帮助!


感谢 哈哈

推荐使用 csurf 中间件

为了防止重复提交及表单提交令牌验证,你可以使用 csurf 这个流行的中间件。csurf 提供了 CSRF(跨站请求伪造)保护,同时也非常适合用来生成和验证表单提交令牌。

安装

首先,你需要安装 csurf 模块:

npm install csurf

示例代码

下面是一个简单的示例代码,展示了如何使用 csurf 来实现防止重复提交的功能:

const express = require('express');
const csrf = require('csurf');
const bodyParser = require('body-parser');

const app = express();

// 使用body-parser中间件解析表单数据
app.use(bodyParser.urlencoded({ extended: false }));

// 创建csrf实例
const csrfProtection = csrf({ cookie: true });

// 设置模板引擎(这里使用EJS作为示例)
app.set('view engine', 'ejs');

// 设置路由
app.get('/', (req, res) => {
  // 渲染一个包含隐藏字段的表单
  res.render('form', { csrfToken: req.csrfToken() });
});

app.post('/submit', csrfProtection, (req, res) => {
  // 处理表单提交逻辑
  console.log('Form submitted successfully.');
  res.send('Form submitted successfully.');
});

// 启动服务器
app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

表单模板

假设你使用 EJS 作为模板引擎,可以创建一个简单的表单模板 views/form.ejs 如下:

<!DOCTYPE html>
<html>
<head>
  <title>CSRF Form</title>
</head>
<body>
  <h1>Submit Form</h1>
  <form action="/submit" method="POST">
    <!-- 隐藏字段用于存储csrfToken -->
    <input type="hidden" name="_csrf" value="<%= csrfToken %>">
    <button type="submit">Submit</button>
  </form>
</body>
</html>

解释

  • body-parser 用于解析表单数据。
  • csrf 中间件会自动生成和验证 csrfToken
  • 在表单中,通过 <input type="hidden" name="_csrf" value="<%= csrfToken %>">csrfToken 传递给后端。
  • 当表单提交时,csrfProtection 中间件会验证 csrfToken 是否合法。

这种方式可以有效防止重复提交和跨站请求伪造攻击。

回到顶部