对Express上的某些请求禁用csrfvalidation

我正在使用Express框架编写一个带有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()); 

我想设置一个没有csrf控制的POST路由。

有几种可能的方法。 您基本上需要了解什么是最简单和最正确的规则来决定是否使用csrf中间件。 如果你想在大多数情况下使用csrf,除了一个小的请求模式白名单,请参考这个答案中关于条件日志logging中间件的例子。

 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())这样的特定path上使用中间件。 你只是想find一个富有performance力的方式,以便在中间件将被使用或不被使用的时候保持清洁。

由于Express中间件按顺序执行,因此可以始终将语句放在代码中的csrf()语句之上。

喜欢这个:

 app.get '/ping', (req, res) -> res.status(200).end() app.use csrf() 

Express会在您的csrf令牌被设置之前返回。 对于非常less量的端点(我只有一个适合这个类别),我发现这是一个更干净的解决scheme。

另外,在撰写本文时,上述答案的代码如下所示:

 customCsrf = (req, res, next) -> if req?.url isnt '/ping' return csrf()(req, res, next) else return next() app.use customCsrf 

那个额外的(请求,水库,下一个)绊了我一会儿,所以希望这可以帮助别人。

dailyjs.com有一个关于csrf和express的好文章。 它基本上是这样工作的:

使用csrf中间件:

 app.configure(function() { // ... app.use(express.csrf()); // .. }); 

创build一个将本地variablestoken设置为csrf值的自定义中间件:

 function csrf(req, res, next) { res.locals.token = req.session._csrf; next(); } 

在你想要的每个路线中使用你的自定义中间件:

 app.get('/', csrf, function(req, res) { res.render('index'); }); 

在您的表单中创build一个隐藏的字段,其中包含csrf值:

 form(action='/contact', method='post') input(type='hidden', name='_csrf', value=token)