30

我正在使用带有 Rails 的 AngularJS。我有以下请求批量更新用户。

 $http{
    method: 'POST',
    url: $scope.update_url,
    params: {selected_ids: userIds}
 }

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

但是对于“POST”请求,我们需要在标头中有一个 CSRF 真实性令牌。

我们如何将 CSRF Token 设置为 post 请求标头?

4

3 回答 3

68

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

您可以全局设置它:

$httpProvider.defaults.headers.post['My-Header']='value'   (or)
$http.defaults.headers.post['My-Header']='value';

或单个请求:

$http({
   headers: {
      'My-Header': 'value'
   }  
});

这是来自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 的摘要,并带有盐以增加安全性。

于 2013-01-01T11:39:44.683 回答
1

如果您想知道如何在 Rails 中实际设置 XSRF-TOKEN cookie 值,这个答案有一个实现Rails CSRF Protection + Angular.js:protect_from_forgery 让我在 POST 上注销

于 2013-11-10T13:59:54.347 回答
0

I recently faced the same issue and adding the gem angular_rails_js solved it. To my understanding it creates for every rails controller a cookie with the rails CSRF-TOKEN that will be catch (default $http behaviour) by angular $http.

于 2015-12-17T10:56:21.547 回答