如何在express3中启用csrf?

一般来说,我很新的expression和nodejs。 我不知道如何启用csrf保护? 问题在于,对于不同的版本,有很多不同的教程,而且完全不能反向兼容。

我已经尝试了几种方法,而且他们似乎没有工作,这是我现在拥有的。 问题是在我的表单中,csrf值是空的。

app.js

var express = require('express'); var http = require('http'); var path = require('path'); var validator = require('express-validator'); var app = express(); app.configure(function() { app.set('port', 3001); app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); app.use(express.favicon()); app.use(express.logger('dev')); app.use(express.json()); app.use(express.urlencoded()); app.use(express.methodOverride()); app.use(express.cookieParser('secret')); app.use(express.bodyParser()); app.use(validator()); app.use(express.session()); app.use(express.csrf()); // Okey, I've used this middleware app.use(app.router); app.use(express.static(path.join(__dirname, 'public'))); app.use(express.errorHandler()); }); app.get('/', function(req, res) { res.render('admin/login'); }); http.createServer(app).listen(app.get('port'), function() { console.log('Express server listening on port ' + app.get('port')); }); 

pipe理员/ login.jade

 doctype 5 html head title= title body form(method='post', action='/admin') input(type='hidden', name='csrf', value=token) input(type='text', name='username') input(type='password', name='password') input(type='submit', value='Login') 

哟需要将生成的标记存储在res.locals对象中,以使其可以从模板中获得,例如使用另一个中间件,在本例中,它会在每个请求中传递给模板:

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

然后在你的模板中

  div form(method="post",action="/login") input(type="hidden", name="_csrf", value=csrftoken) button(type="submit") Login 

我build议你按照Adam Baldwin的说法,在node.js中写下关于安全性的电梯安全博客 。你可以在他的repo中find安全的express骨架。