gpt4 book ai didi

ruby-on-rails - 如何在 Rails 应用程序之间传递 CSRF token

转载 作者:行者123 更新时间:2023-12-04 01:02:54 25 4
gpt4 key购买 nike

我们的 rails3 应用程序与另一个作​​为 REST 函数公开的 rails 应用程序对话。在对 REST 服务进行的所有 POST 调用中,我们在迁移到 rails3 后收到以下警告。

WARNING: Can't verify CSRF token authenticity

当我们对 REST 服务进行 POST 调用时,我们应该如何通过线路传递 csrf token ,ApplicationController 具有protect_from_forgery 方法,并且调用也落在了handle_unverified_request 调用上。我们使用 HTTP 基本身份验证进行身份验证,它似乎工作正常。我们应该怎么做才能解决这个问题。

最佳答案

好的,现在我会尝试回答您的问题。

CSRF token 是“ session 相关的”,这意味着用户必须与他正在与之通信的应用程序共享 session 。这意味着必须在他提交实际表单之前提出请求,这是标准 HTML 表单的情况,其中表单在提交之前显示,因此有空间为该用户生成 CSRF token 。

让我们调用为 UI 按钮提供服务的应用程序 App1 和托管 REST 服务 App2 的应用程序。

用户与 App1 共享 session 并获取 App1 提供的 UI Button。一旦用户单击按钮,就会向 App1 发出请求,而 App1 会向 App2 的 REST 服务发出请求。

结论:用户不与 App2 共享 session ,但您的 App1 与 App2 有 session 。这总结为两件事:

  • 用户不容易受到 App2 上的跨站点伪造,因为他在该服务器上没有 session 。因此,如果我发布类似 <img src="http://app2.com/rest-service/destroy> 的内容在这里,App2 不会认出我,因为我没有与 App2 共享 session 并且没有任何 react 。
  • 您可以在 REST 服务上实现自己的安全措施,以保护其不受公众的影响:
  • 通过 HTTP Basic Auth
  • 进行身份验证
  • 通过 API key 进行身份验证
  • ....

  • 这意味着只要用户不能通过 AJAX 等直接调用,您就可以放弃 REST 服务上的 CSRF 保护并保持安全。

    加法

    CSRF 保护您的网站免受非来自您的来源的提交表单的影响(实际上这仅适用于 POSTed 表单,因为它们通常会操纵数据。

    大场景是:我是攻击者,我想将您的用户帐户名称更新为“Mr. Potatoe”,我这样做的方法是在我的网站上放置一个隐藏表单,该表单将发布到 Yourdomain.com/account带有像 account[name]="Mr. Potatoe" 这样的隐藏字段.现在没有 CSRF 保护会发生什么?我的浏览器提交了表单,并用它发送了身份验证 cookie,我的名字现在是“Mr. Potatoe”。 CSRF 保护会发生什么?我的浏览器提交表单并发送 cookie,但表单没有 CSRF token ,因此请求被拒绝。现在有没有办法让攻击者在这种情况下获得 CSRF token ?答案是不。也许你会问自己......
  • 如果我在我的网站上放置一个指向 Yourdomain.com/account/edit 的隐藏 iframe 怎么办?只需复制包含 token 的隐藏字段? - 答:由于同源策略,它不起作用,如果 iframe 的内容不是来自您的域,您将无法读取 iframe 中的内容。
  • 如果我在后台进行 AJAX 调用以获取 token 怎么办?回答:它不会起作用,因为使用纯 AJAX 你也被绑定(bind)到同源策略。

  • 现在让我们进入正题:我不能从我的页面向您的页面发送隐藏的 AJAX 调用来伤害您在我网站上的用户。

    这是什么意思?您可以实现一个 before 过滤器来检查 request.xhr?是真的,或者用户代理是否类似于“我的 REST 客户端 XY”,因为这不能由 >>浏览器<<中的跨站点请求伪造。因此,如果是这种情况,您可以忽略/禁用 CSRF 保护。

    顺便说一句,如果您想在您的站点内发出 AJAX 请求,您可以像这样获得 CSRF token :
    var token = $('meta[name="csrf-token"]').attr('content');

    请参阅 Rails UJS 脚本: https://github.com/rails/jquery-ujs/blob/master/src/rails.js#L81

    注意:这只能保护您免受跨站点伪造,没有别的......

    关于ruby-on-rails - 如何在 Rails 应用程序之间传递 CSRF token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9141339/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com