2012-01-03 105 views
8

新手。 我正在使用ExpressJS/Node。下面是我的配置的東西:如何在Express中生成CSRF令牌?

var express = require('express'), 
app = express.createServer(), 
jade=require('jade'); 
// Configuration 
app.configure(function(){ 
app.set('views', __dirname + '/views'); 
app.use(express.logger()); 
app.use(express.cookieParser()); 
app.use(express.session({ secret: "secretive secret" })); 
app.set('view engine', 'jade'); 
app.use(express.bodyParser()); 
app.use(express.methodOverride()); 
app.use(require('stylus').middleware({ src: __dirname + '/public' })); 
app.use(app.router); 
app.use(express.static(__dirname + '/public')); 
app.use(express.csrf()); 

我發現快遞目錄csrf.js,並認爲它應該生成並分配給req.body._csrf,但我不知道如何訪問它。

這裏的csrf.js代碼

module.exports = function csrf(options) { 
var options = options || {} 
, value = options.value || defaultValue; 

return function(req, res, next){ 
// generate CSRF token 
var token = req.session._csrf || (req.session._csrf = utils.uid(24)); 

// ignore GET (for now) 
if ('GET' == req.method) return next(); 

// determine value 
var val = value(req); 

// check 
if (val != token) return utils.forbidden(res); 

next(); 
} 
}; 

幫助?謝謝!

回答

16

動態助手已經從快速因爲3.x中刪除

新的用法是app.use(express.csrf());,它來自Connect

1

Express 4.x該中間件被刪除。對於Express 4.x,您可以按如下方式操作:

var csrf = require('csurf'); 
app.use(csrf()); 

啊!您需要在sessioncookieParser中間件之後註冊csrf中間件。

內部路由或按Ctrl

res.render('someform', { csrf: req.csrfToken() }); 

或者你可以考慮

input(type="hidden", name="_csrf", value="#{csrf}") 

你完成還設置局部變量,像這樣

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

然後! :)

0

如果你也想設置一個安全cookie的,可以通過你的前端讀取您的CSRF令牌(角爲例),你可以這樣做:

app.use csrf() 

app.use (req, res, next) -> 
    res.cookie('XSRF-TOKEN', req.csrfToken(), {secure: true}) 
next()