Node.js使用csurf有条件地使用express 4
我尝试在我的快速应用程序的几条路线上使用csurf。 这是方法:
var express = require('express'); var session = require('express-session'); var csrf = require('csurf'); // some more stuff var csrfExclusion = ['/myApi','/unsecure']; var app = express(); var conditionalCSRF = function (req, res, next) { if (csrfExclusion.indexOf(req.path) !== -1){ next(); } else{ csrf(); } }); app.use(conditionalCSRF);
甚至尝试过:
var conditionalCSRF = function (req, res, next) { if (csrfExclusion.indexOf(req.path) !== -1){ next(); } else{ csrf(req, res, next); next(); } });
和
var conditionalCSRF = function (req, res, next) { if (csrfExclusion.indexOf(req.path) !== -1){ next(); } else{ csrf(); next(); } });
但是这给了我一个错误:对象#没有方法'csrfToken'
我怎样才能有条件地使用csurf。 该文件只给出了在快递应用程序中的所有路线上使用它的信息
app.use(csrf());
但那不是我想要的,我想排除一些路线…
善良…马丁
更新:
最后它的工作。 我做了以下几点:
app.use(function(req, res, next){ if (csrfExclusion.indexOf(req.path) !== -1) { next(); } else { csrf()(req, res, next); });
这有条件地添加了csrf中间件。 但是我真的觉得这样称呼是很奇怪的:
csrf()(req, res, next);
我甚至没有得到语法…
根据这个你需要把它分成两个路由器,一个使用csurf,一个不使用。 然后,您将中间件应用到路由器,而不是应用程序。
var routes = express.Router(); var csrfExcludedRoutes = express.Router(); routes.use(csrf()); routes.get('/', function(req, res) { //has req.csrfToken() }); csrfExcludedRoutes.get('/myApi', function(req, res) { //doesn't have req.csrfToken() });
这是一个古老的线程,但我偶然发现它,并认为我会试图解决@marshro提出的在中间件中调用csrf()(req, res, next)
的怪异问题。
这里发生的事情是,csurf从require语句返回一个函数,它本身被用来构build一个具有一些可选configuration参数的中间件函数。
对上面中间件中使用的csrf()
的调用使用缺省选项为每个需要csrf保护的传入请求构build中间件函数。 如果你真的想使用这种方法,你有机会做一个简单的改变,使你的解决scheme更有效率地进行一个非常小的重构来构build中间件:
// 1. Build the csrf middleware function 'csrfMw' once. var csrfMw = csrf(); app.use(function(req, res, next){ if (csrfExclusion.indexOf(req.path) !== -1) { next(); } else { // 2. Use the middleware function across all requests. csrfMw(req, res, next); } );
这就是说 – 如果有机会,您可能需要再次查看文档 – build议采用两种避免这种方法的方法。 第一个设置中间件csrfProtection
并将其应用于select路由。 第二个设置了两个路由器,就像上面提到的@ ben-fortune–一个将csrf应用于一切,另一个不是。 两者都比排除条件更有效率。
所有这一切说 – 我可以看到案件有一个排除名单,并可能使用你的方法,如果我没有时间手动拆分路线。 ;)