Angular JS在POST请求中验证CSRF令牌

Sab*_*kar 29 javascript-framework angularjs

我正在使用AngularJS和Rails.我有以下请求批量更新用户.

 $http{
    method: 'POST',
    url: $scope.update_url,
    params: {selected_ids: userIds}
 }
Run Code Online (Sandbox Code Playgroud)

由于URL的长度限制,这不能是'GET'请求(http://support.microsoft.com/kb/208427)

但对于'POST'请求,我们需要在标头中有一个CSRF真实性标记.

如何将CSRF令牌设置为post请求标头?

asg*_*oth 67

您可以按照$ http服务中的说明设置http标头.

您可以在全球范围内进行设置:

$httpProvider.defaults.headers.post['My-Header']='value'   (or)
$http.defaults.headers.post['My-Header']='value';
Run Code Online (Sandbox Code Playgroud)

或单个请求:

$http({
   headers: {
      'My-Header': 'value'
   }  
});
Run Code Online (Sandbox Code Playgroud)

这是Angular的重要引用:

跨站请求伪造(XSRF)保护XSRF是一种未经授权的站点可以获取用户私有数据的技术.Angular提供以下机制来对抗XSRF.执行XHR请求时,$ http服务从名为XSRF-TOKEN的cookie中读取令牌,并将其设置为HTTP头X-XSRF-TOKEN.由于只有在您的域上运行的JavaScript才能读取Cookie,因此您的服务器可以确保XHR来自您域上运行的JavaScript.

要利用这一点,您的服务器需要在第一个HTTP GET请求中在名为XSRF-TOKEN的JavaScript可读会话cookie中设置令牌.在后续的非GET请求中,服务器可以验证cookie是否与X-XSRF-TOKEN HTTP标头匹配,因此请确保只有您域上运行的JavaScript才能读取令牌.令牌对于每个用户必须是唯一的,并且必须由服务器验证(以防止JavaScript组成自己的令牌).我们建议令牌是您网站的身份验证cookie的摘要,以增加安全性.

  • 我不清楚为什么这个解决方案与Angular的文档一致.文档声明您需要设置cookie,但您似乎是手动设置标题. (2认同)