对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)