求助 - express3.0 csrf 问题,Nodejs 在线等

求助 - express3.0 csrf 问题,Nodejs 在线等

        //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网站和其他网站,都没变化,求解。。 req.session._csrf is deprecated, use req.csrfToken([callback]) instead


4 回复

当然可以!express.csrf() 在 Express 3.x 版本中已经被弃用,推荐使用 csurf 中间件来处理 CSRF 保护。以下是如何使用 csurf 的示例代码,并解释如何正确地生成和验证 CSRF 令牌。

示例代码

首先,你需要安装 csurf 包:

npm install csurf --save

然后,在你的 Express 应用中配置并使用 csurf

const express = require('express');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);
const csurf = require('csurf');

const app = express();

// 配置中间件
app.use(cookieParser());
app.use(session({
    secret: 'your-secret-key',
    store: new MongoStore({
        url: 'mongodb://localhost/your-db-name',
        collection: 'sessions'
    })
}));

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

// 在路由之前应用 csrf 保护
app.use(csrfProtection);

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

// 渲染表单页面
app.get('/form', (req, res) => {
    res.render('form', { csrfToken: req.csrfToken() });
});

// 处理表单提交
app.post('/submit-form', (req, res) => {
    // 验证 CSRF 令牌
    if (req.body._csrf !== req.csrfToken()) {
        return res.status(403).send('Forbidden');
    }
    res.send('Form submitted successfully!');
});

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

解释

  1. 安装和引入依赖

    • csurf:用于生成和验证 CSRF 令牌。
    • cookie-parserexpress-session:用于管理会话和 cookies。
  2. 配置中间件

    • cookieParser():解析请求中的 cookies。
    • express-session():设置会话存储,这里使用了 MongoDB 存储。
  3. 创建 csurf 实例

    • csurf({ cookie: true }):配置 csurf 中间件,启用 cookie 存储 CSRF 令牌。
  4. 应用 CSRF 保护

    • app.use(csrfProtection):在所有路由之前应用 CSRF 保护。
  5. 渲染表单页面

    • res.render('form', { csrfToken: req.csrfToken() }):在视图中传递 CSRF 令牌。
  6. 处理表单提交

    • 验证表单提交中的 _csrf 字段是否与当前会话中的 CSRF 令牌匹配。

通过这种方式,你可以确保 CSRF 令牌在每次请求时都是唯一的,并且可以正确地验证表单提交。


这个提示也告诉你要使用req.csrfToken([callback])代替。

在Express 3.x中,使用CSRF保护时,req.session._csrf 已经被弃用,应该使用 req.csrfToken() 方法来获取CSRF token。

以下是修改后的代码示例:

var express = require('express');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var MongoStore = require('connect-mongo')(session);
var csrf = require('csurf');

var app = express();

app.use(cookieParser());
app.use(session({
    secret: config.session_secret,
    store: new MongoStore({
        url: config.mongodb,
        collection: 'sessions'
    })
}));

app.use(csrf());

app.use(function (req, res, next) {
    res.locals.csrftoken = req.csrfToken();
    next();
});

app.post('/submit', function (req, res) {
    // 处理表单提交
    if (req.body.csrftoken !== req.session.csrftoken) {
        return res.status(403).send('Forbidden');
    }
    // 其他处理逻辑
    res.send('Success');
});

app.listen(3000, function () {
    console.log('Server running on port 3000');
});

解释:

  1. 引入中间件:使用 cookie-parserexpress-session 中间件处理cookies和session。
  2. CSRF中间件:使用 csurf 模块来处理CSRF保护。
  3. 设置CSRF Token:在中间件中使用 req.csrfToken() 获取CSRF Token,并将其添加到 res.locals 中,供视图模板使用。
  4. 验证CSRF Token:在POST路由中验证CSRF Token,确保请求是合法的。

通过这种方式,每次请求都会生成一个新的CSRF Token,以确保安全性。如果你希望CSRF Token保持不变,可以考虑自定义存储逻辑或使用其他方法。

回到顶部