2012-05-04 38 views
6

在我們的Rails應用程序中,用戶常常將多個瀏覽器標籤一次打開幾個小時或幾天。在其中一個選項卡中出現問題時,用戶註銷然後重新登錄(或會話過期並創建新會話)。如何使用Rails中陳舊的CSRF真實性標記處理頁面

這會導致所有其他選項卡上的CSRF真實性令牌失效。如果他們嘗試提交任何表單或者在沒有刷新的情況下在這些選項卡上發出任何ajax請求,他們將會得到一個錯誤(並且實際上會被註銷,因爲這是傳遞錯誤的真實性標記時默認的Rails行爲)。

這種行爲顯然是不可取的。我想知道人們會如何正常處理用戶有一個窗口打開您的網站但真實性標記已過期的情況。

我不想做的只是將它們重定向到登錄頁面,因爲那樣他們可能會失去他們的工作,例如,如果他們已經寫了一篇長博客文章或其他東西。

想到的解決方案是讓一些JavaScript輪詢服務器以檢查真實性令牌是否已更改,或者輪詢用戶的Cookie以檢查會話是否已更改。我從來沒有聽說任何人做過這些,所以我想看看社區的想法。

回答

3

首先:登錄/退出/進入不會導致出現新的csrf令牌。它仍然會保存在用戶的Cookie中。下次通過同一瀏覽器登錄時,它會得到相同的標記。

在最新版本的Rails中,在不正確的令牌的情況下不會出現任何錯誤:所有Rails都會執行 - 只是在將會話傳遞給控制器​​之前重置會話。

因此,更新你的Rails,你會得到更少的痛苦。

+0

你是正確的,登錄/註銷不會導致新的csrf令牌生成。看起來像它回到繪圖板找出這些無效的令牌錯誤來自哪裏 – Jacob

3

你確定你在談論CSRF令牌而不是會話令牌嗎?重定向到登錄CSRF令牌不匹配沒有任何意義。你只是告訴用戶重複他試圖做的任何事情。 (在傳統的Web應用程序中,這通常在提交表單時出現;您可以將CSRF不匹配視爲驗證錯誤,並再次顯示錶單,保留所有字段值,並要求用戶重新提交。 - 重要的應用程序,你可以在響應中使用某種通用的CSRF標誌,如果已設置,請讓用戶再次執行他所做的任何操作(按下按鈕等),甚至自動完成整個事件而不會打擾用戶。

+0

你能詳細說明如何處理csrf不匹配作爲驗證錯誤?是否有Rails-y的方式來做到這一點? – Jacob

+0

我對Rails不是很熟悉,但[this](https://github.com/bartt/enhanced_req uest_forgery_protection/blob/master/lib/enhanced_request_forgery_protection.rb#L64)似乎是一種方法。 – Tgr

相關問題