Kraken.js CSRF 处理

Posted

技术标签:

【中文标题】Kraken.js CSRF 处理【英文标题】:Kraken.js CSRF Handling 【发布时间】: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?

【问题讨论】:

【参考方案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 会很棒),但我可以看到这可能发生的几种方式:

    csrf secret(不是令牌,请注意)在初始 GETPOST 之间的某个时间被重新生成或删除。唯一可行的方法是,如果会话中存储为_csrfSecret 的值在请求之间被更改或删除。确保您的会话正常运行。

    其中一个安全标头让您感到悲伤。尝试在您的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://***.com/a/18776974/1935918

【讨论】:

以上是关于Kraken.js CSRF 处理的主要内容,如果未能解决你的问题,请参考以下文章

apache_conf 在kraken.js 1.0下的config.json中进行Formadible设置

csrf防护处理

配置 AccessDeniedHandler 以处理无效的 csrf 令牌

初探CSRF在ASP.NET Core中的处理方式

如何使用 Spring RESTful Web 服务处理 CSRF 保护?

Django,Ajax提交csrf_token处理