2016-08-20 87 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