2011-05-22 81 views
5

我使用Rails 3.0.2,默認情況下在application_controller.rb中有protect_from_forgeryRails 3 protect_from_forgery無法正常工作?

我想觸發一個InvalidAuthenticityToken
要做到這一點我已經加入這個JavaScript到我的網頁:

$('input[name=authenticity_token]').val('aaa') 

檢查與螢火蟲的DOM我看到authenticity_token隱藏字段正確更新。

如果我提交表單並檢查從服務器的日誌,我看到相對參數正確設置爲'aaa'。我期望得到一個InvalidAuthenticityToken而請求被處理,因爲它是正確的!

這怎麼可能?

+1

你應該接受答案,因爲它解決了你的pb。 – apneadiving 2011-05-26 16:55:02

+0

重置會話不足以防止CSRF。在導軌4中,默認的對策是引發異常,這種異常更安全。 – 2015-10-02 11:48:07

回答

12

真實性標記/ csrf行爲的文檔已過時。 InvalidAuthenticityToken異常不再在這些情況下拋出,而是您的會話剛剛重置。如果您想要以不同方式(或以舊方式)處理此問題,則可以在控制器上的handle_unverified_request中定義自己的行爲。

+0

非常感謝!我做到了,它完美的工作! – Diego 2011-05-24 06:04:14

1

我也相信你將不得不重置駐留在你的表單所在的html頁面元標記中的真實性標記(我假設你有<%= csrf_meta_tag%>)。 Rails檢查表單中的任何一個標記(你在上面的JavaScript中更改過)或HTML頁面的元標記中的標記是否與Rails的預期真實性標記相匹配,並且如果它們中的任何一個匹配,則InvalidAuthenticityToken將贏得' t被觸發....