Node.js 有条件地使用 csurf 和 express 4
Posted
技术标签:
【中文标题】Node.js 有条件地使用 csurf 和 express 4【英文标题】:Node.js use csurf conditionally with express 4 【发布时间】:2014-09-19 10:58:37 【问题描述】:我尝试在我的 express 应用中仅在几条路线上使用 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();
);
但这给了我一个错误:Object # has no method '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);
我什至不明白语法...
【问题讨论】:
感谢您分享您的发现,您也可以为此写一个单独的答案。无论如何,我想分享一下,目前有些情况似乎无法免除 csrf。未解决的问题:github.com/expressjs/csurf/issues/10#issuecomment-232501314 【参考方案1】:根据this,你需要把它分成两台路由器,一台使用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()
);
【讨论】:
感谢您的链接...这可能也有效..我现在使用描述的解决方案... 我无法让这个建议的解决方案发挥作用,但原始发帖人在他的更新中描述的解决方案成功了。【参考方案2】:这是一个旧线程,但我偶然发现了它,并认为我会尝试解决@marshro 提出的关于在中间件中调用csrf()(req, res, next)
的奇怪问题。
这里发生的是 csurf 从 require 语句返回一个函数,该函数本身用于构建带有一些可选配置参数的中间件函数。
在上面的中间件中使用的对csrf()
的调用构建了中间件函数,并为每个需要csrf 保护的传入请求提供了默认选项。如果您真的想使用这种方法,您确实有机会进行简单的更改以使您的解决方案更高效,只需一次非常小的重组即可构建中间件:
// 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);
);
这就是说 - 当您有机会时,您可能想再次查看文档 - 建议使用两种方法来避免这种方法。第一个设置中间件csrfProtection
并将其应用于选择路由。第二个设置了两个路由器,如上面提到的@ben-fortune - 一个将 csrf 应用于所有东西,一个不应用。两者都比排除条件更有效。
所有这一切 - 我可以看到有排除列表的情况,如果我没有时间手动拆分路线,可以使用您的方法。 ;)
【讨论】:
以上是关于Node.js 有条件地使用 csurf 和 express 4的主要内容,如果未能解决你的问题,请参考以下文章
获取 ForbiddenError:无效的 csrf 令牌(使用 firebase auth、autodesk forge 和 node.js)
EVP_DecryptFinal_ex:使用 Node.js 时解密错误