InvalidAuthenticityToken ошибки в мобильном телефоне

Я прочитал несколько вопросов и ответов здесь, в Stackru, о InvalidAuthenticityToken и protect_from_forgery, но не получил ни одного более мудрого.

У меня есть веб-сайт, который получает сотни таких ошибок каждый день. Похоже, что они в основном (только?) С мобильного телефона, но я проверял это только через образцы.

Я понимаю, почему есть AuthenticityToken и необходимость добавления

<%= csrf_meta_tags %>

в application.html (который у меня есть), а также с protect_from_forgery в контроллере приложения. У меня есть и csrf_meta_tags, и:

protect_from_forgery with: :exception

в моем контроллере приложений, как по умолчанию.

Я понимаю, что могу "решить" проблему, удалив protect_from_forgery, но это сделало бы меня уязвимым для CSRF-атак, так что это не совсем решение, не так ли? Я мог бы добавить "за исключением" protect_from_forgery для постов формы, которые имеют место, но это сделало бы меня такой же уязвимой, верно?

Изменить: Я попытался получить доступ к форме с моего мобильного телефона с отключенными куки и произошла ошибка 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 

1 ответ

Решение

Этот вопрос обсуждается здесь. Если это ваша проблема, вы должны увидеть 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

Но это, кажется, все еще открытый вопрос.

Другие вопросы по тегам