2011-10-12 93 views
21

我注意到,如果您發佈無效的CSRF令牌,rails/devise會自動將您註銷。Rails CSRF令牌 - 它們是否過期?

我有一個應用程序不刷新頁面,用戶長時間坐在實時頁面上。時不時的用戶被踢出去。我想知道CSRF令牌是否過期,使其無效。

這就是爲什麼我試圖學習,Rails CSRF令牌是否過期?有沒有時間設置在某個地方? Rails中

感謝

+0

你能描述空閒一段時間後用戶正在做什麼(狀態更新的HTTP POST,獲取新數據等)。 – Nick

回答

24

CSRF保護的工作原理是作爲形式的現場提交,以及在用戶會話中存儲一個隨機值。如果在提交表單時這些值不匹配,Rails會拒絕表單提交請求。

如果您在Rails中使用默認的Cookie會話存儲,那麼會話將不會過期(直到cookie發生)。如果您使用的是其他文件(支持文件或數據庫的會話),那麼是的,如果這些會話過期,則表單提交將失敗並顯示CSRF錯誤。

因此,如果您使用基於Cookie的會話(默認),請檢查cookie過期時間。如果這看起來不錯,這可能是其他一些問題。

+0

你沒有提到csrf cookie的過期時間。它是一個會話cookie嗎? – Ethan

+0

它存儲在會話中,是的。只有在會話cookie中,如果你沒有使用ActiveRecord支持的會話。 – Lambart

+0

這個答案確實幫助我理解了一些概念並解決了我們發現的一個錯誤。謝謝!無論如何,我真的很想明白爲什麼cookie需要?如果rails給你一個authenticiy_token並且你用同樣的標記提交表單,爲什麼需要cookie?我試圖在清除緩存後提交表單,並且我得到了'ActionController :: InvalidAuthenticityToken'。表單上的令牌是否存儲在會話中,並且當表單get被提交時它會同時發送cookie和表單並驗證兩個令牌?謝謝。 –