如何在express3中启用csrf?

Sta*_*tan 1 node.js csrf-protection express

我一般都是表达和节点的新手.我想知道如何启用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'));
});
Run Code Online (Sandbox Code Playgroud)

管理员/ 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')
Run Code Online (Sandbox Code Playgroud)

alf*_*dev 5

Yo需要将生成的令牌存储在res.locals对象中,以使其可以从模板中使用,例如使用其他中间件,在此示例中,它会在每个请求中传递给模板:

app.use(express.csrf());
app.use(function (req, res, next) {
  res.locals.csrftoken = req.csrfToken();
  next();
});
Run Code Online (Sandbox Code Playgroud)

然后在你的模板中

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

我建议你跟随Adam Baldwin他在node.js中写关于安全性的电梯安全博客你可以在他的回购中找到一个安全的快速骨架.