2013-12-06 4 views
1

Я очень новичок в том, чтобы выразить и nodejs в целом. Интересно, как я могу включить защиту csrf? Проблема в том, что существует множество различных обучающих программ для разных версий, и это полностью не совместимо с обратной стороной.Как включить csrf в express3?

Я пробовал пару подходов, и они, похоже, не работают, это то, что у меня есть сейчас. Проблема в том, что в моей форме значение 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')); 
}); 

админ/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') 

ответ

5

Yo нужно сохранить сгенерированный маркер в 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 

Я рекомендую вам следовать Адам Болдуин он пишет lift security blog о безопасности в node.js Вы можете найти безопасный экспресс скелет в his repo.