2010-03-06 38 views
0

我正在構建一個Flex 4 + Rails 2.3.5應用程序。首先,我使用XML來傳遞日期,並且我曾經收到一個錯誤,抱怨我手動通過的真實性令牌,然後通過錯誤。重構後RubyAmf Rails似乎沒有抱怨authenticity_token

之後,我重新考慮了我的代碼,以使用RubyAmf,這似乎是工作,但我沒有在第一次傳入authenticity_token,但我注意到,Rails沒有抱怨,請求經過。我的應用程序仍然沒有註釋protect_from_forgery。

RubyAmf會以某種方式繞過嗎?

感謝,

回答

1

Ruby AMF直接調用控制器操作並在序列化爲AMF後返回結果。這與首先​​通過路由器的標準HTTP請求的工作方式相反。

+0

僞造保護是由控制器作爲的before_filter發射了,不應該的問題,如果路由器被稱爲與否 – 2010-03-06 19:54:17

1

我相信僞造保護不火過GET請求,只帖子,刪除和看跌期權。也許你正在測試的場景正在執行GET請求?

+0

隨着rubyamf我可以發送POST請求 – Tam 2010-03-06 20:43:00

1

爲了解釋camwest的回答中更詳細一點:

當你做一個AMF請求,比方說,articles_controllerupdate行動,請求實際上並沒有去直接在控制器和動作。這個AMF請求(這是一個POST請求)實際上通過Rails路由器到達rubyamf_controllergateway動作(AMF終點)。目標控制器和操作(articles_controller,update動作)被標記爲此POST請求的參數。

在此POST調用中設置的mime_typeamf。 RubyAMF插件將此mime_type添加到未檢查僞造保護的mime_types列表中。因此,即使沒有authenticity_token,對rubyamf_controllergateway操作的調用也會成功執行。

從Flex中,您可能已將一些參數發送到articles_controller,update操作。這些作爲序列化的AMF對象到達gateway操作。這些參數在這裏反序列化。

gateway動作然後在內部調用目標控制器和動作(articles_controller,update動作)。目標行動做它的東西,並返回一個響應。 gateway操作獲取此目標操作的響應,將其序列化爲AMF並將其發送回客戶端。

在Rails 2.x中,這個內部調用沒有調用僞造保護機制。因此,即使您沒有將authenticity_token作爲參數之一發送到目標操作,也可以正常工作。

這在Rails 3中發生了變化。即使是內部調用也會調用僞造保護機制。目標操作檢查是否存在authenticity_token參數。所以,你需要從Flex發送它。

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