【问题标题】:Kraken.js CSRF HandlingKraken.js CSRF 处理
【发布时间】:2013-12-06 12:13:23
【问题描述】:

我对 krakenjs 有疑问,我是 node/express 新手。

krakenjs 设置为默认 csrf 保护(我知道如何禁用,但我不想这样做),但我不知道如何处理 csrf 并避免 403 错误。

在 ejs 文件中我得到了这一行。

<input type="hidden" name="_crsf" value="<%= _csrf %>" />

它会生成正确的csrf,那里没有问题。

这是我的路线

server.post('/isengard/fact/new', function(req,res){
    var new_fact = Fact({
        title : req.body.fact_title,
        description : req.body.fact_description,
        source : req.body.fact_source
    });
    new_fact.save(function(err){
        if(err) return handleError(err);
        var model = {status:true};
        res.render('isengard/create',model);
    });
});

但是当我发送表单 (POST) 时,我收到了这个错误。

403 Error: Forbidden
at Object.exports.error (/Users/onur/Documents/node/sage/node_modules/express/node_modules/connect/lib/utils.js:63:13)
at createToken (/Users/onur/Documents/node/sage/node_modules/express/node_modules/connect/lib/middleware/csrf.js:82:55)
at /Users/onur/Documents/node/sage/node_modules/express/node_modules/connect/lib/middleware/csrf.js:48:24
at csrf (/Users/onur/Documents/node/sage/node_modules/kraken-js/node_modules/lusca/index.js:112:13)
at /Users/onur/Documents/node/sage/node_modules/kraken-js/node_modules/lusca/index.js:60:21
at xframe (/Users/onur/Documents/node/sage/node_modules/kraken-js/node_modules/lusca/index.js:131:9)
at /Users/onur/Documents/node/sage/node_modules/kraken-js/node_modules/lusca/index.js:60:21
at p3p (/Users/onur/Documents/node/sage/node_modules/kraken-js/node_modules/lusca/index.js:144:9)
at /Users/onur/Documents/node/sage/node_modules/kraken-js/node_modules/lusca/index.js:60:21
at Object.appsec (/Users/onur/Documents/node/sage/node_modules/kraken-js/node_modules/lusca/index.js:65:9)

谁能解释我如何处理 csrf?

【问题讨论】:

    标签: node.js express csrf


    【解决方案1】:

    除非您需要 csrf 保护,否则将其放入您的 config.json 以完全禁用它。 然后您的应用程序将正常运行。

    "middleware": {        
          "appsec": {
            "priority": 110,
            "module": {
                "name": "lusca",
                "arguments": [
                    {
                        "csrf": false,
                        "xframe": "SAMEORIGIN",
                        "p3p": false,
                        "csp": false
                    }
                ]
            }
        },
    }
    

    【讨论】:

      【解决方案2】:

      其实你的问题是你有:

      <input type="hidden" name="_crsf" value="<%= _csrf %>" />
      

      代替:

      <input type="hidden" name="_csrf" value="<%= _csrf %>" />
      

      注意name 属性中的拼写错误。

      【讨论】:

      • Jean-Charles 添加了很好、有用的评论,但这是原始帖子的正确答案。
      • 我在哪里可以读到它?没有关于如何配置它的信息。
      【解决方案3】:

      kraken 中的 csrf 几乎完全由 csrf 连接中间件处理(另外一个是将令牌以 _csrf 的形式暴露给您的视图)。

      更多信息会大有帮助(至少是 req/res 标头,但 an HAR 会很棒),但我可以看到这可能发生的几种方式:

      1. csrf secret(不是令牌,请注意)在初始 GETPOST 之间的某个时间被重新生成或删除。唯一可行的方法是,如果会话中存储为_csrfSecret 的值在请求之间被更改或删除。确保您的会话正常运行。
      2. 其中一个安全标头让您感到悲伤。尝试在您的middleware-development.json 中使用类似以下内容的方式暂时关闭它们:

        {
          "middleware": {
            "appsec": {
              "csp": false,
              "xframe": false,
              "p3p": false
            }
          } 
        }
        

      【讨论】:

      • 在这个答案所指的版本中,配置设置在config/middleware.json。安全由lusca 处理。在当前的 kraken (v1.0.x) 中,配置设置在 config/config.json
      【解决方案4】:

      诀窍是您需要将 POST 测试包装在 GET 中,并从 cookie 中解析必要的 CSRF 令牌。

      这是一个例子:https://stackoverflow.com/a/18776974/1935918

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-19
        • 2015-06-18
        • 2013-11-24
        • 2011-05-09
        • 2022-07-01
        • 2013-05-05
        • 2018-10-12
        • 1970-01-01
        相关资源
        最近更新 更多