求助 - 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');
});
解释
-
安装和引入依赖:
csurf
:用于生成和验证 CSRF 令牌。cookie-parser
和express-session
:用于管理会话和 cookies。
-
配置中间件:
cookieParser()
:解析请求中的 cookies。express-session()
:设置会话存储,这里使用了 MongoDB 存储。
-
创建
csurf
实例:csurf({ cookie: true })
:配置csurf
中间件,启用 cookie 存储 CSRF 令牌。
-
应用 CSRF 保护:
app.use(csrfProtection)
:在所有路由之前应用 CSRF 保护。
-
渲染表单页面:
res.render('form', { csrfToken: req.csrfToken() })
:在视图中传递 CSRF 令牌。
-
处理表单提交:
- 验证表单提交中的
_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');
});
解释:
- 引入中间件:使用
cookie-parser
和express-session
中间件处理cookies和session。 - CSRF中间件:使用
csurf
模块来处理CSRF保护。 - 设置CSRF Token:在中间件中使用
req.csrfToken()
获取CSRF Token,并将其添加到res.locals
中,供视图模板使用。 - 验证CSRF Token:在POST路由中验证CSRF Token,确保请求是合法的。
通过这种方式,每次请求都会生成一个新的CSRF Token,以确保安全性。如果你希望CSRF Token保持不变,可以考虑自定义存储逻辑或使用其他方法。