2014-05-05 75 views
4

在我的一個控制器中,我編寫了以下內容來保護CSRF的某些頁面。Rails 4在哪裏存儲用於CSRF保護的身份驗證令牌?

protect_from_forgery :only => [:foo, :bar] 

當我加載URL的對應於foobar,我查看HTML,我沒有看到任何隱藏的輸入域或包含任何安全令牌的meta標籤,描述here

但是,在測試過程中,我確實注意到CSRF對這些頁面無效,雖然它對於同一應用程序中未受保護的其他頁面有效。

那麼Rails 4在哪裏存儲用於驗證請求來自原始頁面的安全令牌?

請注意,我已經通過Ruby On Rails Security Guide讀,並且從部分上protect_from_forgery,它說

這會自動包含在由導軌產生的各種形式和Ajax請求 安全令牌。如果安全令牌與預期的 不匹配,會話將被重置。

的問題是,這安全令牌似乎是從上啓用了CSRF保護頁面的形式丟失,即使CSRF的確不是對他們有效。


注意,這個代碼是從class project,其中的目標之一是進行點擊劫持攻擊繞過CSRF項目。我在這裏問的問題是正交於作業的目的。

我只是很好奇Rails如何做CSRF。

在直接做了rails server之後,我找不到安全令牌的相關URL是http://localhost:3000/protected_transfer

回答

9

CSRF令牌存儲在用戶的會話中(默認情況下,它位於Rails中; Rails 4中的加密cookie)。它還作爲<meta>標記(供JavaScript庫使用)通過csrf_meta_tags幫助程序方法寫入頁面,以及頁面中由form_tagform_for生成的任何表單中的隱藏字段。

看看這個項目,CSRF令牌沒有出現的原因是HTML是用一個字面值<form>標籤寫的,而不是form_for幫助器,它將包括CSRF令牌。此外,csrf_meta_tags助手不在佈局中,這就是元標記沒有被寫入的原因。

該表格被硬編碼發佈到<form action="post_transfer" method="post">不應受CSRF保護保護,因此該表格應該是CSRF-able,即使該視圖標記爲protect_from_forgeryprotected_post_transfer方法甚至不可能接受合法的請求,因爲真實性令牌從不發送。

我懷疑教師錯過了這個,因爲測試將使用合法的形式(擊中未經驗證的端點,並讓它成功),然後指示學生嘗試對受保護的端點進行CSRF(這將會不管怎麼說都不會通過召集),所以你最終會測試兩種不同的事情,這些事情會以錯誤的理由產生正確的結果。

+0

感謝您實際查看項目代碼。令人驚訝的是,它*確實接受了合法的請求,現在我正在摸索着理解爲什麼。 – merlin2011

+0

它發佈到'post_transfer'(表單動作是硬編碼的)而不是'protected_post_transfer',所以它實際上應該容易受到CSRF的攻擊。你確定它不是? –

+0

非常好的趕上!它看起來像教練搞砸了。我會將它指向'protected_post_transfer'並查看它是否仍然接受任何請求。 – merlin2011

相關問題