Мы наблюдаем неприятную и, вероятно, проблему аутентификации токена CSRF на основе браузера в нашем приложении Rails 4.1. Мы публикуем его здесь, чтобы спросить сообщество, видят ли его другие.
Имейте в виду, что большинство инструментов для создания отчетов об ошибках, таких как Honeybadger, автоматически подавляют ActionController::InvalidAuthenticityToken, поэтому вы обычно не видите проблему в своем инструменте для создания отчетов об ошибках, если только не приложите все усилия, чтобы увидеть ее. .
Вот в чем проблема, и это НЕ проблема разработки — это производственная проблема, которую еще предстоит диагностировать.
Исключением является просто ActionController::InvalidAuthenticityToken при обычном входе на наш сайт. После тщательного изучения authenticity_token, отправленного формой, и _csrf_token сеанса (мы используем active_record_store в качестве параметра session_store), они просто не совпадение. При непосредственном рассмотрении могу сделать вывод только, что это совершенно разные токены, но не знаю почему.
Это не простой вопрос разработчика-новичка, пожалуйста, НЕ отвечайте простыми ответами о том, как токен CSRF должен быть передан от клиента к серверу или как обойти защиту от подделки на моих контроллерах. Мне неинтересно слышать от кого-либо один из этих двух ответов: Вы не знаете, о чем говорите, и не понимаете глубины и сложности вопроса. Мне просто интересно Услышав от людей с веб-сайтами с высоким трафиком, которые могут подтвердить, что это происходит с незначительным числом посетителей (и, как ни странно, это влияет на определенные браузеры чаще, чем на другие браузеры).
Мы видим эту проблему широко, может быть, около 1-2% нашего веб-сайта с высокой посещаемостью. Я вижу это только в продакшене, я не могу воспроизвести его в разработке вообще.
Я чаще всего вижу это в браузерах IE 11 и Edge (вы заметите, что Rails 4.1 был выпущен до IE 11 и Edge), но также и в Chrome на Android, а иногда и в мобильном Safari.
Наши заголовки Cache-control установлены следующим образом:
Cache-Control: max-age=0, private, must-revalidate