表示CSRF令牌validation

我有CSRF令牌的问题。 当我提交一个表单时,会生成一个新的XSRF-TOKEN ,但是我想我生成了两个不同的标记,我有点困惑。 还有一个称为_csrf的标记,所以我在开发人员工具(XSRF-TOKEN和_csrf)中看到两个不同的cookie, _csrf在发布后不会更改。

我想要做的是为每个post请求生成一个新的标记,并检查它是否有效。 有一件事我知道我应该为了安全而做,但是我卡住了。

这是漫长的一天,我刚刚进入Express和NodeJS。

这是我目前的设置。

 var express = require('express') , passport = require('passport') , flash = require('connect-flash') , utils = require('./utils') , csrf = require('csurf') // setup route middlewares ,csrfProtection = csrf({ cookie: true }) , methodOverride = require('method-override') , bodyParser = require("body-parser") , parseForm = bodyParser.urlencoded({ extended: false }) , cookieParser = require('cookie-parser') , cookieSession = require('cookie-session') , LocalStrategy = require('passport-local').Strategy , RememberMeStrategy = require('../..').Strategy; var app = express(); app.set('views', __dirname + '/views'); app.set('view engine', 'ejs'); app.engine('ejs', require('ejs-locals')); app.use(express.logger()); app.use(express.static(__dirname + '/../../public')); app.use(cookieParser()); app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json()); app.use(methodOverride()); app.use(express.session({ secret: 'keyboard cat' })); app.use(flash()); // Initialize Passport! Also use passport.session() middleware, to support // persistent login sessions (recommended). app.use(passport.initialize()); app.use(passport.session()); app.use(passport.authenticate('remember-me')); app.use(app.router); app.use(csrf()); app.use(function (req, res, next) { res.cookie('XSRF-TOKEN', req.csrfToken()); res.locals.csrftoken = req.csrfToken(); next(); }); 

路线

 app.get('/form', csrfProtection, function(req, res) { // pass the csrfToken to the view res.render('send', { csrfToken: req.csrfToken()}); }); app.post('/process', parseForm, csrfProtection, function(req, res) { res.send('data is being processed'); }); 

send.ejs(/ form GET)

 <form action="/process" method="POST"> <input type="hidden" name="_csrf" value="<%= csrfToken %>"> Favorite color: <input type="text" name="favoriteColor"> <button type="submit">Submit</button> </form> 

根据您分享的代码量,有几件事看起来不正确:

1。 您可能需要交换这些行,以便csrf在路由之前运行。

 app.use(app.router); app.use(csrf()); 

2。 这些线路需要放置在路线之前。

 app.use(csrf()); app.use(function (req, res, next) { res.cookie('XSRF-TOKEN', req.csrfToken()); res.locals.csrftoken = req.csrfToken(); next(); }); app.use(app.router); 

3。 在表单中使用locals.csrftoken

 <form action="/process" method="POST"> <input type="hidden" name="_csrf" value="<%= csrftoken %>"> Favorite color: <input type="text" name="favoriteColor"> <button type="submit">Submit</button> </form> 

cookie中的令牌将与快速会话中的令牌完全不同。 你想检查一个或其他不是两个。

我会完全禁用cookies! 因为它为我工作。

var csrfProtection = csurf({cookie:false});

作者在这里提到https://github.com/expressjs/csurf/issues/52

接下来你想在这里find的“X-CSRF-Token”到ajax post上的头文件: Express.js csrf token with jQuery Ajax

下面的代码正在为我工​​作。 让我知道,如果你仍然面临问题。

如上所述,您希望使用cookie,您已使csurf知道您正在使用Cookie来设置CSRF令牌。

第一步:configuration

 var csrf = require('csurf'); var cookieparser= require('cookie-parser'); //cookieparser must be placed before csrf app.use(bodyparser.urlencoded({extended:false})); app.use(cookieParser('randomStringisHere222')); app.use(csrf({cookie:{key:XSRF-TOKEN,path:'/'}})); //add the your app routes here app.use("/api", person); app.use("/", home); 

第二步:在路线中,

 res.render('myViewPage',{csrfTokenFromServer:req.csrfToken()}); 

第3步:在csrf标记的HTML中包含隐藏字段示例:

 <form action="/api/person" method="POST"> <input type="hidden" name="_csrf" value=<%=csrfTokenFromServer %> /> First name:<br> <input type="text" name="firstname" value=""> <br> Last name:<br> <input type="text" name="lastname" value=""> <br><br> <input type="submit" value="Submit"> </form>