2013-10-24 67 views

回答

0

在该文的另一部分,作者解释说,这暴露了一个“标记”属性到您应该包含在隐藏的输入字段中的所有模板。

注意到他玉石例如2号线:

form(action='/form',method='post') 
    input(type='hidden', name='_csrf', value=token) 
    label(for='color') Color: 
    input(type='text',name='color',size='50') 
    button(type='submit') Save 
+2

我的意思是,我应该在所有现有的表单中放入'input(type ='hidden',name ='_ csrf',value = token)'? –

7

一种选择是一个隐藏的输入字段添加到您的所有形式你提到。但根据上CSRF快递文档:

缺省值功能检查由bodyParser()中间件产生req.body,通过query()产生req.query"X-CSRF-Token"报头字段。

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

点仍然是你需要:

  • 通过从快速的_.csrf令牌提供给您的客户端
  • 返回从客户端的_.csrf令牌回到表达对您的所有状态突变的REC t(POST/PUT/DELETE),Express可以将其与req.session._csrf进行比较以完成周期。

例如,如果您的客户端是棱角分明,在$http模块默认提供了CSRF保护,寻找一个cookie称为XSRF-TOKEN,并通过头部上的所有状态突变请求返回这个值(POST/PUT/DELETE)称为X-XSRF-TOKEN。这是一个不幸的巧合,因为名称不同于Express查找它的标题名称,即X-CSRF-TOKEN(通知-XSRF--CSRF-)。

为了克服这一点,你需要

步骤1:在快递方面增加了CSRF中间件寻找在X-XSRF-TOKEN头中的令牌值的默认值的功能,除了所有其他默认地方:

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; 
    } 
}); 

步骤2:在快递方面再次设置在cookie是角将寻找req.session._csrf下由CSRF中间件添加的令牌值,使用自定义的中间件:

app.use(function(req, res, next) { 
    req.cookie('XSRF-TOKEN', req.session._csrf); 
    next(); 
}); 

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