我已閱讀關於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
謝謝,我設法通過那篇文章的幫助在我的開發版本上創建了這個問題。同時使用protect_from_forgery和::null_session「解決」這個問題,就像向該特定控制器添加一個異常一樣......但是我的問題在這裏:這樣做是否安全? – Christoffer
此外,只有「protect_from_forgery」使網站至少不會崩潰。所以,我想這只是這些解決方案的最佳選擇的問題? – Christoffer
'::null_session'是Rails 5和4.2的默認值。對於舊版本我不知道。我會認爲這是保存。它在csrf標記問題的情況下提供空會話散列。更改'Cache-Control'可能會對性能產生影響。 – slowjack2k