移动设备中的 InvalidAuthenticityToken 错误
InvalidAuthenticityToken errors in mobile
我在 Whosebug 上阅读了关于 InvalidAuthenticityToken 和 protect_from_forgery 的多个问题和答案,但 none 更明智。
我的网站每天都会出现数百个此类错误。它们似乎主要(仅?)来自移动设备,但我只是通过样本验证了这一点。
我理解为什么会有 AuthenticityToken 以及添加的必要性
<%= csrf_meta_tags %>
在 application.html(我有)中以及在应用程序控制器中有 protect_from_forgery。我同时拥有 csrf_meta_tags 和:
protect_from_forgery with: :exception
在我的应用程序控制器中,默认情况下。
我意识到我可以通过删除 protect_from_forgery 来 "solve" 解决问题,但这会使我容易受到 CSRF 攻击,所以这不是真正的解决方案,对吗?我可以为发生的表单帖子添加 "except" for protect_from_forgery 但这会让我同样容易受到攻击,对吧?
编辑:我尝试在禁用 cookie 的情况下使用我的手机访问表单,但遇到了 422 错误。虽然无法让它引起异常。为我的 "result" 函数添加一个例外删除了它,但我猜这使它容易受到攻击?
Edit2:我在同一页面上有多个表单(例如搜索表单)。也许这会影响问题?
我现在无法拥有它,因为它每天会导致数百名用户出错,而且我无法删除它,因为我担心它会使我的网站容易受到黑客攻击。
那么,我能做什么?有合适的中间立场吗?
有什么方法可以改变 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
已讨论此问题 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
但这似乎仍然是一个悬而未决的问题。
我在 Whosebug 上阅读了关于 InvalidAuthenticityToken 和 protect_from_forgery 的多个问题和答案,但 none 更明智。
我的网站每天都会出现数百个此类错误。它们似乎主要(仅?)来自移动设备,但我只是通过样本验证了这一点。
我理解为什么会有 AuthenticityToken 以及添加的必要性
<%= csrf_meta_tags %>
在 application.html(我有)中以及在应用程序控制器中有 protect_from_forgery。我同时拥有 csrf_meta_tags 和:
protect_from_forgery with: :exception
在我的应用程序控制器中,默认情况下。
我意识到我可以通过删除 protect_from_forgery 来 "solve" 解决问题,但这会使我容易受到 CSRF 攻击,所以这不是真正的解决方案,对吗?我可以为发生的表单帖子添加 "except" for protect_from_forgery 但这会让我同样容易受到攻击,对吧?
编辑:我尝试在禁用 cookie 的情况下使用我的手机访问表单,但遇到了 422 错误。虽然无法让它引起异常。为我的 "result" 函数添加一个例外删除了它,但我猜这使它容易受到攻击?
Edit2:我在同一页面上有多个表单(例如搜索表单)。也许这会影响问题?
我现在无法拥有它,因为它每天会导致数百名用户出错,而且我无法删除它,因为我担心它会使我的网站容易受到黑客攻击。
那么,我能做什么?有合适的中间立场吗?
有什么方法可以改变 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
已讨论此问题 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
但这似乎仍然是一个悬而未决的问题。