【问题标题】:after refactoring to RubyAmf Rails doesn't seem to complain about authenticity_token重构为 RubyAmf Rails 后似乎没有抱怨authenticity_token
【发布时间】:2010-03-06 10:21:17
【问题描述】:

我正在构建一个 Flex 4 + Rails 2.3.5 应用程序。首先,我使用 XML 传递日期,我曾经收到一个错误,抱怨我手动传递的 Authenticity Token 然后通过错误。

之后,我重构了我的代码以使用 RubyAmf,这似乎可以正常工作,但一开始我没有传递authentity_token,但我注意到 Rails 没有抱怨并且请求通过了。我的应用仍然未注释protect_from_forgery。

RubyAmf 会以某种方式绕过它吗?

谢谢,

【问题讨论】:

    标签: ruby-on-rails apache-flex rubyamf


    【解决方案1】:

    Ruby AMF 直接调用控制器动作,并将序列化后的结果返回给 AMF。这与首先​​通过路由器的标准 HTTP 请求的工作方式相反。

    【讨论】:

    • 伪造保护由控制器作为 before_filter 触发,路由器是否调用它无关紧要
    【解决方案2】:

    我相信伪造保护不会针对 GET 请求触发,仅针对 POST、DELETE 和 PUT。也许您正在测试的场景是执行 GET 请求?

    【讨论】:

    • 使用 ruby​​amf 我可以发送 POST 请求
    【解决方案3】:

    更详细地解释 camwest 的答案:

    当您向 articles_controllerupdate 操作发出 AMF 请求时,该请求实际上并没有直接发送到该控制器和操作。这个 AMF 请求(即 POST 请求)实际上是通过 Rails 路由器到达rubyamf_controllergateway 动作(AMF 端点)。目标控制器和操作(articles_controllerupdate 操作)被标记为此 POST 请求的参数。

    在这个 POST 调用中设置的mime_typeamf。 RubyAMF 插件将此 mime_type 添加到未检查伪造保护的 mime_types 列表中。因此,即使没有 authenticity_token,对 rubyamf_controllergateway 操作的调用也会成功。

    从 Flex 中,您可能已向 articles_controllerupdate 操作发送了一些参数。这些作为gateway 操作的序列化AMF 对象到达。这些参数在这里被反序列化。

    gateway 动作然后在内部调用目标控制器和动作(articles_controllerupdate 动作)。目标操作完成其工作并返回响应。 gateway action 获取此目标 action 的响应,将其序列化为 AMF 并发送回客户端。

    在 Rails 2.x 中,这个内部调用没有调用伪造保护机制。因此,即使您不将 authenticity_token 作为参数之一发送到目标操作,它也可以正常工作。

    这在 Rails 3 中发生了变化。即使是内部调用也会调用伪造保护机制。目标操作检查是否存在 authenticity_token 参数。所以,你需要从 Flex 发送它。

    更多:http://anjantek.com/2011/05/08/rails-3-rubyamf-flex-csrf-solution/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-18
      • 1970-01-01
      • 1970-01-01
      • 2017-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      相关资源
      最近更新 更多