我正在构建一个 Flex 4 + Rails 2.3.5 应用程序。首先,我使用 XML 传递日期,我曾经收到一个错误,抱怨我手动传递的 Authenticity Token,然后通过错误来解决。
之后,我重构了我的代码以使用 RubyAmf,这似乎可以正常工作,但我一开始并没有传递authenticity_token,但我注意到Rails 没有抱怨并且请求通过了。我的应用仍然未注释protect_from_forgery。
RubyAmf 会以某种方式绕过它吗?
谢谢,
谭
我正在构建一个 Flex 4 + Rails 2.3.5 应用程序。首先,我使用 XML 传递日期,我曾经收到一个错误,抱怨我手动传递的 Authenticity Token,然后通过错误来解决。
之后,我重构了我的代码以使用 RubyAmf,这似乎可以正常工作,但我一开始并没有传递authenticity_token,但我注意到Rails 没有抱怨并且请求通过了。我的应用仍然未注释protect_from_forgery。
RubyAmf 会以某种方式绕过它吗?
谢谢,
谭
我相信伪造保护不会针对 GET 请求触发,只有 POST、DELETE 和 PUT。也许您正在测试的场景是执行 GET 请求?
更详细地解释 camwest 的答案:
articles_controller
当您向,操作发出 AMF 请求时update
,该请求实际上并没有直接发送到该控制器和操作。这个 AMF 请求(它是一个 POST 请求)实际上是通过 Rails 路由器到达rubyamf_controller
action gateway
(AMF 端点)。目标控制器和动作 ( articles_controller
, update
action) 被标记为这个 POST 请求的参数。
这个 POST 调用的mime_type
集合是amf
. RubyAMF 插件将此添加mime_type
到未检查伪造保护的 mime_types 列表中。因此,对rubyamf_controller
,gateway
操作的调用成功通过,即使没有authenticity_token
.
在 Flex 中,您可能已经向articles_controller
,update
操作发送了一些参数。这些作为序列化的 AMF 对象到达gateway
操作。这些参数在这里被反序列化。
然后该gateway
动作在内部调用目标控制器和动作(articles_controller
,update
动作)。目标操作完成其工作并返回响应。动作获取此目标动作的gateway
响应,将其序列化为 AMF 并发送回客户端。
在 Rails 2.x 中,这个内部调用没有调用伪造保护机制。因此,即使您不将authenticity_token
as 作为参数之一发送到目标操作,它也可以正常工作。
这在 Rails 3 中发生了变化。即使是内部调用也会调用伪造保护机制。目标操作检查authenticity_token
参数是否存在。因此,您需要从 Flex 发送它。
更多信息:http: //anjantek.com/2011/05/08/rails-3-rubyamf-flex-csrf-solution /
Ruby AMF 直接调用控制器动作,并在序列化到 AMF 后返回结果。这与首先通过路由器的标准 HTTP 请求的工作方式相反。