我正在写使用Node.js的快递框架小的Web应用程序。 我使用CSRF中间件,但我想禁用它的一些要求。 这是我包括在我的应用程序:
var express = require('express');
var app = express();
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.cookieSession({secret: 'secret'}));
app.use(express.csrf());
我想设置一个POST路线没有CSRF控制。
有几种可能的方法。 基本上,您需要了解什么是决定是否要使用CSRF中间件最简单,最正确的规则。 如果你想CSRF的大部分时间,除了请求模式的小白名单,请按照例如这样的回答我对有条件的记录中间件 (复制下面为了方便)。
var express = require("express");
var csrf = express.csrf();
var app = express.createServer();
var conditionalCSRF = function (req, res, next) {
//compute needCSRF here as appropriate based on req.path or whatever
if (needCSRF) {
csrf(req, res, next);
} else {
next();
}
}
app.use(conditionalCSRF);
app.listen(3456);
另一个办法只能使用像一定路径上的中间件是app.post('/forms/*', express.csrf())
你只是想找到一个表达方式,使其干净的时候中间件会或不会被使用。
由于快递中间件,以便为执行,你可以始终把代码的CSRF()语句你上面的语句。
像这样:
app.get '/ping', (req, res) -> res.status(200).end()
app.use csrf()
之前你CSRF令牌被设置Express将返回。 对于端点的非常小的数字(我只是有一个适合这一类),我发现这是一个清晰的解决方案。
此外,截至记者发稿,针对上述答案的代码是这样的:
customCsrf = (req, res, next) ->
if req?.url isnt '/ping'
return csrf()(req, res, next)
else
return next()
app.use customCsrf
额外的(REQ,水库,下一个)绊倒了我一段时间,所以希望这可以帮助别人。
dailyjs.com大约有CSRF和快速的好文章。 它基本上是这样的:
使用CSRF中间件:
app.configure(function() {
// ...
app.use(express.csrf());
// ..
});
新建一个用于在局部变量的自定义中间件token
的CSRF值:
function csrf(req, res, next) {
res.locals.token = req.session._csrf;
next();
}
使用自定义的中间件在你希望每一个路线:
app.get('/', csrf, function(req, res) {
res.render('index');
});
在窗体创建包含CSRF值的隐藏字段:
form(action='/contact', method='post')
input(type='hidden', name='_csrf', value=token)