0

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

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

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

谢谢,

4

3 回答 3

1

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

于 2010-03-06T18:10:22.013 回答
1

更详细地解释 camwest 的答案:

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

这个 POST 调用的mime_type集合是amf. RubyAMF 插件将此添加mime_type到未检查伪造保护的 mime_types 列表中。因此,对rubyamf_controller,gateway操作的调用成功通过,即使没有authenticity_token.

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

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

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

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

更多信息:http: //anjantek.com/2011/05/08/rails-3-rubyamf-f​​lex-csrf-solution /

于 2011-10-20T12:34:12.850 回答
1

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

于 2010-03-06T18:15:09.030 回答