Kraken.js 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?

其实你的问题是你有:

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

代替:

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

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

诀窍是你需要将你的POSTtesting封装在一个GET中,并从cookie中parsing出必要的CSRF标记。

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

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

多一点信息会有很长的路要走(至lessreq / res头文件,但HAR会很棒),但是我可以看到几种方法:

  1. csrf的秘密 (不是令牌,介意你)正在重新生成或删除一些时间之间的初始GETPOST 。 唯一可行的方法是在会话中存储为_csrfSecret的值在请求之间被更改或删除。 确保你的会议正常工作。
  2. 安全标题之一是给你悲伤。 尝试在middleware-development.json 暂时closures它们,如下所示:

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

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

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