Nodejs Express 3.x 的 csrf 怎么搞?

Nodejs Express 3.x 的 csrf 怎么搞?

RT。发现3.X里面删掉了这一方法,找了个中间件express-csrf还是基于2.X的。

请问哪位做过的呀,谢谢!

8 回复

Node.js Express 3.x 的 CSRF 如何实现?

在 Express 3.x 中,官方已经移除了内置的 CSRF 保护功能。不过,你可以使用第三方中间件来实现这一功能。这里推荐一个名为 express-csrf 的中间件,虽然它是基于 Express 2.x 版本开发的,但在 Express 3.x 中仍然可以正常工作。

安装 express-csrf

首先,你需要安装 express-csrf

npm install express-csrf --save

示例代码

接下来,我们将通过一个简单的示例来展示如何在 Express 3.x 应用中添加 CSRF 保护。

var express = require('express');
var csrf = require('express-csrf');

var app = express();

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

// 初始化 CSRF 中间件
csrf(app);

// 首页路由,用于显示表单
app.get('/', function(req, res) {
    // 渲染表单并传递 CSRF token
    res.render('index', { csrfToken: req.csrfToken() });
});

// 表单提交处理路由
app.post('/submit', function(req, res) {
    // 检查 CSRF token 是否有效
    if (req.checkCsrfToken(req.body._csrf)) {
        res.send('Form submitted successfully!');
    } else {
        res.status(403).send('Forbidden: Invalid CSRF token.');
    }
});

// 启动服务器
app.listen(3000, function() {
    console.log('Server running on http://localhost:3000');
});

解释

  1. 安装与引入模块:首先安装 express-csrf 并在应用中引入。

  2. 初始化 CSRF 中间件:调用 csrf(app) 来初始化 CSRF 保护。

  3. 渲染表单:在 GET 请求处理函数中,通过 req.csrfToken() 获取 CSRF token,并将其传递给视图模板。

  4. 验证 CSRF token:在 POST 请求处理函数中,使用 req.checkCsrfToken(token) 方法来验证表单提交中的 CSRF token 是否有效。如果无效,则返回 403 错误。

  5. 启动服务器:最后启动服务器,监听端口。

通过这种方式,你可以在 Express 3.x 应用中轻松地添加 CSRF 保护。希望这对你有所帮助!


 app.use(express.csrf());
 app.use(function(req,res,next){
      res.locals.token = req.session._csrf;
      next()
  });

谢谢,刚刚查到了!

查到了,原来用法不一样了。

var express = require('express');

app.configure(function(){ … app.use(express.csrf()); });

这个中间件需要session支持,因此它的代码应该放在session()之后.

这是啥

防跨站攻击

        //cookie
        app.use(express.cookieParser());
        //session
        app.use(express.session({
            secret:config.session_secret,
            store: new mongoStore({
                url: config.mongodb,
                collection : 'sessions'
            })
        }));
        
        app.use(express.csrf());
        
        app.use(function(req, res, next){
            res.locals.req = req;
            res.locals.session = req.session;
            res.locals.csrf = req.session ? req.session._csrf : ''
            next();
        });

我的_csrf一直在变化着的呢?我看cnodejs网站和其他网站,都没变化,求解。。

在 Node.js 的 Express 3.x 版本中,确实没有内置的 CSRF 保护机制,但你可以使用第三方中间件来实现这一点。express-csrf 是一个可用的选择,尽管它是基于 Express 2.x 版本开发的,但在 Express 3.x 中仍然可以正常工作。

以下是如何在 Express 3.x 应用程序中集成 express-csrf 并实现 CSRF 保护的步骤:

  1. 首先安装 express-csrf

    npm install express-csrf --save
    
  2. 在你的 Express 应用程序中引入并配置 express-csrf

    var express = require('express');
    var csrf = require('express-csrf');
    
    var app = express();
    
    // 启用 express-csrf
    csrf(app);
    
    // 设置视图引擎
    app.set('views', __dirname + '/views');
    app.set('view engine', 'jade');
    
    // 示例路由
    app.get('/', function (req, res) {
        // 渲染表单并将 CSRF token 发送到客户端
        res.render('index', { csrfToken: req.csrfToken() });
    });
    
    app.post('/submit', function (req, res) {
        // 检查 CSRF token
        if (req.body._csrf !== req.csrfToken()) {
            return res.status(403).send('Forbidden');
        }
        res.send('Form submitted successfully!');
    });
    
    app.listen(3000);
    
  3. 创建一个简单的视图模板(例如 index.jade)以显示表单,并包含 CSRF token:

    form(action='/submit' method='POST')
        input(type='hidden' name='_csrf' value=csrfToken)
        input(type='text' name='username')
        button(type='submit') Submit
    

通过以上步骤,你就可以在 Express 3.x 应用程序中成功地实现 CSRF 保护。这种方法简单且易于集成,适用于大多数基本需求。

回到顶部