9

我們的生產服務器現在已經生成了幾個月的無效真實性令牌錯誤。幾乎所有發送(PUT | POST | DELETE)請求的表單都會產生這些錯誤。有時會出現錯誤,有時候不會。至於它們爲什麼會出現,似乎沒有任何押韻或理由。錯誤本身並不經常發生,但這是我們的擔心。以下是導致此錯誤的典型表單的示例。調試隨機無效的真實性令牌錯誤

<form class="button_to" method="post" action="/lesson_progress_trackers/333"> 
    <input type="hidden" name="_method" value="patch"> 
    <input class="finish-lesson-button" type="submit" value="Done!"> 
    <input type="hidden" name="authenticity_token" value="Qd3FsJZY2UXR9vahuFmaY5rrqA+J5xzGpl4cGI2Vwerx8PZPQtDMugz6oqoe3iviC+/U5zTYPdeX3apwbap09E=="> 
    <input type="hidden" name="completed" value="true"> 
</form> 

這是我到目前爲止發現的。

  1. 我們使用Turbolinks 2.5.3(我們還沒有在一年內更新過)。
  2. 在每一次無效令牌錯誤的情況下,用戶都會向服務器傳遞一個真實令牌,它最終會失效。
  3. 我們目前在我們的應用控制器中使用protect_from_forgery with: :exception
  4. 幾個月前,當我們將一堆新代碼投入生產時,錯誤開始出現。這個新的代碼跨越數百個文件,但到目前爲止,我沒有在代碼中發現任何與此問題相關的文件。
  5. 錯誤可能發生在任何類型的瀏覽器和設備上。
  6. 流量增加與出現無效驗證令牌之間沒有關聯。
  7. 用戶可以來自任何國家。
  8. 這些不是遇到這些問題的機器人。我們甚至有同事遇到這個錯誤,儘管他們不記得他們做了什麼來製作它。
  9. 用戶遵循典型的如果不是預期的行爲。他們按照預期使用應用程序。我瀏覽了他們的點擊並記錄了行爲歷史來總結這一點。

最終我想弄清楚如何解決這個問題。我的第一步是成功重現錯誤,但我甚至無法做到這一點。我的問題是:我能做些什麼來幫助我找出造成這種情況的原因?我沒有選擇。謝謝!

+0

是的,我做到了。這發生在真實的用戶身上。這些不是機器人。我發現的模式是典型的用戶行爲。他們在做什麼沒有任何異常。我願意說這是預期的行爲。這就是爲什麼它很可怕。 – jason328

+0

你能排除任何過期嗎?餅乾只是一件事,它可能是一些與時間相關的比較,服務器的錯誤時間,預計特定時間的數據庫字段或類似的東西。 – Smar

+0

我不這麼認爲?你能澄清一下你的問題嗎? – jason328

回答

1

不知道,如果這太遲了沒用,但我有同樣的問題。我能夠重現:

  1. 請確保您退出了應用
  2. 在頁面打開瀏覽器選項卡,將標誌
  3. 讓它坐太久到期會話/ CSRF令牌(可能需要幾個小時)
  4. 打開登錄頁面的另一個選項卡,然後登錄
  5. 返回到舊選項卡並嘗試再次登錄 - 將發生InvalidAuthenticityToken異常。

我認爲這發生在我身上,因爲這兩個選項卡共享一個會話,這是在新選項卡打開時創建的會話。但是,舊選項卡在登錄表單中仍舊具有來自舊會話的csrf標記。當新的會話cookie和舊的csrf令牌一起提交時,它們不匹配,因此引發錯誤。

我不知道如何真正解決這個問題,除了更好地處理錯誤,以便用戶看不到一個令人困惑的錯誤頁面。

順便說一句,我正在使用設計,但我不認爲它是特定於設計。

相關問題