angularjs如何处理csrf?

时间:2015-04-13 05:03:01

标签: javascript angularjs security csrf

我在理解以下代码时遇到了一些麻烦

run.$inject = ['$http'];

function run($http) {
  $http.defaults.xsrfHeaderName = 'X-CSRFToken';
  $http.defaults.xsrfCookieName = 'csrftoken';
}

因为我一直以为csrf被注入html表单或ajax调用而不是cookie,因为csrf可以防止任何试图使用你的cookie进行身份验证的对手。

有人可以详细解释角度处理csrf的方式以及它如何从后端获取令牌?

1 个答案:

答案 0 :(得分:0)

我不能比angular docs更好地回答这个问题,所以我只想引用:

  

跨站点请求伪造(XSRF)保护

     

XSRF是一种未经授权的网站可以获取用户私人数据的技术。   Angular提供了一种对抗XSRF的机制。执行XHR时   请求,$ http服务从cookie中读取令牌(默认情况下,   XSRF-TOKEN)并将其设置为HTTP标头(X-XSRF-TOKEN)。仅限   在您的域上运行的JavaScript可以读取cookie,即您的服务器   可以放心,XHR来自运行在你身上的JavaScript   域。不会为跨域请求设置标头。

     

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

     

可以使用xsrfHeaderName和指定标题的名称   $ httpProvider.defaults的xsrfCookieName属性   config-time,运行时$ http.defaults或每请求配置   对象

$http.defaults.xsrfCookieName只允许您指定Cookie的名称,否则它将查找默认的XSRF-TOKEN

在服务器端实现中,我建议使用一些node.js中间件来处理初始cookie的设置,而不是自己滚动。特别注意csurf,因为它似乎是最受欢迎的。您还可以尝试使用senchalab的csrf中间件。这些都应该足以让你开始。