【问题标题】:Angular JS Verify CSRF Token in POST RequestAngular JS 在 POST 请求中验证 CSRF 令牌
【发布时间】:2012-12-16 02:30:36
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: angularjs javascript-framework


    【解决方案1】:

    您可以按照$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 是一种技术 未经授权的网站可以获取您用户的私人数据。角 提供以下机制来对抗 XSRF。执行 XHR 时 请求时,$http 服务从名为 XSRF-TOKEN 并将其设置为 HTTP 标头 X-XSRF-TOKEN。由于只 在您的域上运行的 JavaScript 可以读取 cookie、您的服务器 可以确定 XHR 来自运行在您的 域。

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

    【讨论】:

    • 谢谢阿斯哥特!这是设置 CSRF-Token 的发布请求的正确方法吗?或者我应该创建一个隐藏表单并在 ng-click() 上提交带有 studentIds 的表单?但在那种情况下,我怎样才能得到响应数据?再次感谢!
    • 我添加了 Angular 本身的引用。
    • 我不清楚为什么这个解决方案与 Angular 的文档一致。文档声明您需要设置 cookie,但您似乎是手动设置标题。
    • @asgoth 我不确定这如何对抗 CSRF。我认为 CSRF 有效,因为从另一个浏览器页面调用同一域会重新发送与该域关联的 cookie。如果我们将令牌放在 cookie 中,那会不会导致该检查无用?
    • @RevNoah 顶部的代码示例是有关如何在 $http 服务上设置标头的通用示例。如果设置了 cookie 令牌,角度将自动设置标题。
    【解决方案2】:

    如果您想知道如何在 Rails 中实际设置 XSRF-TOKEN cookie 值,这个答案有一个实现 Rails CSRF Protection + Angular.js: protect_from_forgery makes me to log out on POST

    【讨论】:

      【解决方案3】:

      我最近遇到了同样的问题,添加 gem angular_rails_js 解决了它。据我了解,它为每个 rails 控制器创建了一个带有 rails CSRF-TOKEN 的 cookie,它将被 angular $http 捕获(默认 $http 行为)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-21
        • 1970-01-01
        • 2016-05-12
        • 1970-01-01
        • 2020-09-12
        • 2017-01-11
        • 2017-11-29
        • 2021-08-14
        相关资源
        最近更新 更多