2016-08-20 74 views
2

我已閱讀關於InvalidAuthenticityToken和protect_from_forgery的StackOverflow的多個問題和解答,但沒有明智之舉。移動中的InvalidAuthenticityToken錯誤

我有一個網站,每天都會有數百個這些錯誤。他們似乎主要來自手機(僅限於?),但我只通過樣品進行了驗證。

我明白爲什麼有一個AuthenticityToken並且需要在應用控制器中application.html加入

<%= csrf_meta_tags %> 

(我有),以及具有protect_from_forgery。我的csrf_meta_tags和:

protect_from_forgery with: :exception 

在我的應用程序控制器中,默認情況下。

我意識到我可以通過刪除protect_from_forgery來「解決」問題,但這會讓我容易受到CSRF攻擊,因此這不是一個真正的解決方案,是嗎?我可以爲protect_from_forgery添加一個「除外」的表單帖子,但這會讓我變得脆弱,對吧?

編輯:我試圖訪問與我的手機與禁用cookie的表單,並遇到422錯誤。儘管如此,卻無法讓它引發異常。爲我的「結果」函數添加一個異常就可以解除這個異常,但是這讓我覺得很脆弱?

編輯2:我在同一頁面上有幾種表單(例如搜索表單)。也許這可能會影響這個問題?

我現在處於一個我無法擁有的位置,因爲它每天導致數百名用戶出錯,我無法刪除它,因爲我擔心它會讓我的網站容易被黑客攻擊。

那麼,我該怎麼辦?有一個體面的中間地帶嗎?

是否有任何方法可以改變protect_from_forgery,並且仍然相當自信,我不會讓我的數據庫被黑客破壞?

我沒有使用任何API的網站,所有的錯誤來自相同類型的形式。我知道這個問題存在一個JavaScript部分,但並不真正如何使用這些信息來解決問題。

在此先感謝!例外的

的例子,我得到:

An ActionController::InvalidAuthenticityToken occurred in calculations#result: 

ActionController::InvalidAuthenticityToken 

------------------------------- 
Request: 
------------------------------- 

* URL : http://www.example.com/calculation/result 
* HTTP Method: PUT 
* IP address : 217.214.148.251 
* Parameters : {"utf8"=>"✓", "_method"=>"put", "authenticity_token"=>"udnClerrF5UWvg84uaD82TzmPx/vWssv2wN9UPqyn10UwXqbOwa2FBtnZ5Nfo7HPh9xbA2OSrrUNineW50XiYg==", "commit"=>"Calculate", "controller"=>"calculations", "action"=>"result", "id"=>"123"} 
* Timestamp : 2016-08-19 12:11:09 UTC 
* Server : 2696e83c-1538-434d-ab6d-4e16577698d0 
* Rails root : /app 
* Process: 6 

------------------------------- 
Session: 
------------------------------- 

* session id: "42b36aacc78102605cb3365922a550b1" 
* data: {"session_id"=>"42b36aacc78102605cb3365922a550b1", 
"_csrf_token"=>"KU43tmmXbxxgoabHrbejg+NWWP1tUVoWABNDqO8FiFI="} 


------------------------------- 
Environment: 
------------------------------- 

* CONTENT_LENGTH : 322 
* CONTENT_TYPE : application/x-www-form-urlencoded 
* HTTP_ACCEPT : text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
* HTTP_ACCEPT_ENCODING : gzip, deflate 
* HTTP_ACCEPT_LANGUAGE : sv-se 
* HTTP_CONNECTION : close 
* HTTP_CONNECT_TIME : 0 
* HTTP_COOKIE : __unam=91429fa-156a1632125-9bccf3-3; _ga=GA1.2.357545074.1471586444; _gat=1 
* HTTP_HOST : www.example.com 
* HTTP_ORIGIN : http://www.example.com 
* HTTP_REFERER : http://www.kalkyleramera.se/calculation 
* HTTP_TOTAL_ROUTE_TIME : 0 
* HTTP_USER_AGENT : Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_3 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13G34 Safari/601.1 
* HTTP_VERSION : HTTP/1.1 
* HTTP_VIA : 1.1 vegur 
* HTTP_X_FORWARDED_FOR : 217.214.148.251 
* HTTP_X_FORWARDED_PORT : 80 
* HTTP_X_FORWARDED_PROTO : http 
* HTTP_X_REQUEST_ID : 5e925192-d6ea-4cd3-b049-20010f11f2c2 
* HTTP_X_REQUEST_START : 1471608669086 

回答

2

這個問題進行了討論here。如果是你的問題,你應該在日誌中看到Can't verify CSRF token authenticity Completed 422 Unprocessable Entity。兩種解決方案進行了討論

  • 變化緩存控制config.action_dispatch.default_headers.merge!('Cache-Control' => 'no-store, no-cache')
  • 變化無效會話空會話protect_from_forgery with: :null_session

但它似乎仍然是一個懸而未決的問題。

+0

謝謝,我設法通過那篇文章的幫助在我的開發版本上創建了這個問題。同時使用protect_from_forgery和::null_session「解決」這個問題,就像向該特定控制器添加一個異常一樣......但是我的問題在這裏:這樣做是否安全? – Christoffer

+0

此外,只有「protect_from_forgery」使網站至少不會崩潰。所以,我想這只是這些解決方案的最佳選擇的問題? – Christoffer

+0

'::null_session'是Rails 5和4.2的默認值。對於舊版本我不知道。我會認爲這是保存。它在csrf標記問題的情況下提供空會話散列。更改'Cache-Control'可能會對性能產生影響。 – slowjack2k