gpt4 book ai didi

express - ExpressJS 中的 CSRF 保护

转载 作者:行者123 更新时间:2023-12-02 06:35:45 24 4
gpt4 key购买 nike

来自 http://sporcic.org/2012/10/csrf-with-nodejs-and-express-3 :

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

使用上述保护,是否意味着我应该隐藏 _csrf在我的所有表单中隐藏输入,包括仅限管理员页面?

最佳答案

一种选择是在您提到的所有表单中添加一个隐藏的输入字段。但根据 csrf 上的 Express 文档:

The default value function checks req.body generated by the bodyParser() middleware, req.query generated by query(), and the "X-CSRF-Token" header field.



因此,根据您的客户端框架,您还可以使用查询字符串或 X-CSRF-Token备择方案。

重点仍然是您需要:
  • 通过_.csrf从 Express 到您的客户端的 token
  • 返回 _.csrf在所有状态变化请求(POST/PUT/DELETE)上从客户端返回到 Express 的 token ,以便 Express 可以将其与 req.session._csrf 进行比较完成循环。

  • 例如,如果您的客户端在 Angular 中, $http模块默认提供 csrf 保护,查找名为 XSRF-TOKEN 的 cookie并通过名为 X-XSRF-TOKEN 的 header 在所有状态变异请求 (POST/PUT/DELETE) 上返回此值.这是一个不幸的巧合,因为名称与 Express 查找它的 header 名称不同,即 X-CSRF-TOKEN (注意 -XSRF--CSRF- )。

    为了克服这个你需要

    第一步 :在 Express 端,增加 CSRF 中间件的默认值函数以在 X-XSRF-TOKEN 中查找 token 值。 header ,除了所有其他默认位置:
    app.use(express.csrf({value: function(req) {
    var token = (req.body && req.body._csrf) ||
    (req.query && req.query._csrf) ||
    (req.headers['x-csrf-token']) ||
    // This is the only addition compared to the default value function
    (req.headers['x-xsrf-token']);
    return token;
    }
    });

    第二步 :在Express端再次设置 req.session._csrf下CSRF中间件添加的token值在 Angular 将查找的 cookie 中,使用自定义中间件:
    app.use(function(req, res, next) {
    req.cookie('XSRF-TOKEN', req.session._csrf);
    next();
    });

    现在 Angular 会找到它并将其包含在 X-XSRF-TOKEN 中。头,无需任何进一步的操作。

    关于express - ExpressJS 中的 CSRF 保护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19566949/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com