Kraken.js CSRF处理

时间:2013-11-21 20:08:26

标签: node.js express csrf

我对krakenjs有疑问,我是节点/表达新手。

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?

4 个答案:

答案 0 :(得分:4)

实际上,你的问题是你有:

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

而不是:

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

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

答案 1 :(得分:1)

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

以下是一个示例:https://stackoverflow.com/a/18776974/1935918

答案 2 :(得分:1)

kraken中的csrf几乎完全由csrf连接中间件处理(另外一个是将标记暴露给你的视图_csrf)。

更多的信息会有很长的路要走(至少req / res标题但是an HAR会很棒)但是我可以看到一些可能发生这种情况的方法:

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

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

答案 3 :(得分:1)

除非您需要csrf保护,否则请将其放在config.json中以完全禁用它。 然后你的应用程序就会运行。

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