У меня была такая же проблема, но со страницами, которые были кэшированы. Страницы буферизировались с использованием устаревшего токена подлинности и всех действий с использованием методов post / put / delete, которые распознавались как попытки подделки. Ошибка (422 Unprocessable Entity) была возвращена пользователю.
Решение для Rails 3:
Добавить:
skip_before_filter :verify_authenticity_token
или, как указано в «Сагиво» в Rails 4, добавить:
skip_before_action :verify_authenticity_token
На страницах, которые делают кеширование.
Как @toobulkeh прокомментировал это не уязвимость в :index
, :show
действиях, но остерегайтесь использовать это на :put
, :post
действий.
Например:
caches_page :index, :show
skip_before_filter :verify_authenticity_token, :only => [:index, :show]
Ссылка: http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html
Примечание, добавленное barlop-Rails 4.2, устарело skip_before_filter в пользу skip_before_action https://guides.rubyonrails.org/4_2_release_notes.html "Семейство методов * _filter было удалено из документации. Их использование не рекомендуется в пользу * _action семейство методов "
Для Rails 6 (как указывалось в «collimarco») вы можете использовать skip_forgery_protection
и то, что это безопасно использовать для REST API, который не использует данные сеанса.
skip_before_action :verify_authenticity_token
:index, :show
действиях. Но будьте осторожны с этим:put, :post
!Для меня причиной этой проблемы под Rails 4 было отсутствие,
Линия в моем основном макете приложения. Я случайно удалил его, когда переписал свой макет.
Если этого нет в основном макете, он понадобится вам на любой странице, на которой вы хотите использовать токен CSRF.
источник
Есть несколько причин этой ошибки (относящихся к Rails 4).
1. Проверьте наличие
<%= csrf_meta_tags %>
в макете страницы.2. Убедитесь, что токен подлинности отправляется с вызовами AJAX, если используется
form_for
помощник сremote: true
опцией. Если вы не можете включить строку<%= hidden_field_tag :authenticity_token, form_authenticity_token %>
с блоком формы.3. Если запрос отправляется с кэшированной страницы, используйте кэширование фрагментов, чтобы исключить часть страницы, которая отправляет запрос, например,
button_to
и т. Д. В противном случае токен будет устаревшим / недействительным.Я не хотел бы аннулировать защиту CSRF ...
источник
Просто добавив
authenticity_token
в форму исправил это для меня.источник
Маркер подлинности - это случайное значение, сгенерированное, по вашему мнению, для подтверждения того, что запрос отправлен из формы на вашем сайте, а не где-то еще. Это защищает от CSRF-атак:
http://en.wikipedia.org/wiki/Cross-site_request_forgery
Проверьте, кто этот клиент / IP, похоже, они используют ваш сайт без загрузки ваших просмотров.
Если вам нужно продолжить отладку, этот вопрос является хорошим началом: Понимание токена подлинности Rails
Отредактировано для объяснения: это означает, что они вызывают действие для обработки отправки вашей формы, даже не отображая вашу форму на вашем веб-сайте. Это может быть вредоносным (например, публикация спам-комментариев) или указание на то, что клиент пытается напрямую использовать API вашего веб-сервиса. Вы единственный, кто может ответить на этот вопрос в зависимости от характера вашего продукта и анализа ваших запросов.
источник
ActionController::InvalidAuthenticityToken
также может быть вызвано неверно настроенным обратным прокси. Это тот случай, если в трассировке стека вы получите строку, похожую на следующуюRequest origin does not match request base_url
.При использовании обратного прокси-сервера (такого как nginx) в качестве приемника для запроса HTTPS и передачи запроса в незашифрованном виде на бэкэнд (например, приложение Rails), бэкэнд (более конкретно: Rack) ожидает некоторые заголовки с дополнительной информацией об исходном клиентском запросе для того, чтобы иметь возможность применять различные задачи обработки и меры безопасности.
Более подробная информация доступна здесь: https://github.com/rails/rails/issues/22965 .
TL; DR: решение состоит в том, чтобы добавить несколько заголовков:
источник
слишком поздно, чтобы ответить, но я нашел решение.
Когда вы определяете свою собственную HTML-форму, вы пропускаете строку токена аутентификации, которая должна быть отправлена контроллеру из соображений безопасности. Но когда вы используете rails form helper для генерации формы, вы получаете что-то вроде следующего
Таким образом, решение проблемы состоит в том, чтобы либо добавить поле authenticity_token, либо использовать помощники форм rails, а не удалять, понижать или обновлять rails.
источник
Если вы сделали
rake rails:update
или недавно изменили свою версиюconfig/initializers/session_store.rb
, это может быть признаком старых файлов cookie в браузере. Надеемся, что это сделано в dev / test (это было для меня), и вы можете просто удалить все куки браузера, связанные с данным доменом.Если это в работе, и вы изменили
key
, подумайте о том, чтобы вернуть его обратно, чтобы использовать старые куки (<- только предположение).источник
У меня была эта проблема с вызовами JavaScript. Я исправил это, просто потребовав jquery_ujs в файл application.js.
источник
У нас была та же проблема, но мы заметили, что это было только для запросов, использующих http: //, а не с https: //. Причина была
secure: true
для session_store:Исправлено с помощью HTTPS ~ везде :)
источник
rails s
(не-SSL) вместо конечной точки SSL, которую я настроил для разработки. Только когда я прочитал ваш комментарий, я понял, что я делаю. Как только я вернулся к использованию SSL, все снова заработало. Спасибо!secure: true
я написалsecure: !Rails.env.development?
Для рельсов 5 лучше добавить,
protect_from_forgery prepend: true
чем пропуститьverify_authentication_token
источник
Добавить
в
источник
У меня была эта проблема, и причина была в том, что я скопировал и вставил контроллер в свое приложение. Мне нужно было перейти
ApplicationController
наApplicationController::Base
источник
У меня была такая же проблема на localhost. Я изменил домен для приложения, но в файле URLs и hosts был еще старый домен. Обновил закладки моего браузера и файл hosts для использования нового домена, и теперь все работает нормально.
источник
Может быть, у вас есть настройки NGINX для HTTPS, но ваши сертификаты недействительны? У меня была похожая проблема в прошлом, и перенаправление с http на https решило проблему
источник
Я проверил наличие <% = csrf_meta_tags%> и очистка куки в браузере сработала для меня.
источник
Следуя рекомендациям Chrome Lighthouse для ускорения загрузки приложений, я установил асинхронный Javascript:
views/layout/application.html.erb
Это сломало все и получило ошибку токена для моих удаленных форм. Удаление
async: true
исправило проблему.источник
Этот ответ гораздо более конкретен для Ruby on Rails, но, надеюсь, он кому-нибудь поможет.
Вам необходимо включать токен CSRF в каждый не GET-запрос. Если вы привыкли использовать JQuery, Rails имеет вспомогательную библиотеку, которая называется
jquery-ujs
поверх нее и добавляет некоторые скрытые функции. Одна из вещей, которые он делает, автоматически включает токен CSRF в каждыйajax
запрос. Смотрите здесь .Если вы откажетесь от этого, как я, вы можете оказаться с ошибкой. Вы можете просто отправить токен вручную или использовать другую библиотеку, чтобы помочь очистить токен от DOM. Смотрите этот пост для более подробной информации.
источник
В среде разработки я попытался решить многие из этих проблем в Rails 6. Ни одна из них не помогла. Поэтому, если ни одно из этих предложений не сработало, попробуйте ниже.
Единственное решение, которое я нашел, было добавить txt файл в вашу папку / tmp.
В корневом каталоге вашего приложения запустите:
Или вручную создайте файл с таким именем в папке / tmp. Поскольку это исправило это для меня, я предполагаю, что корень проблемы - конфликт кеширования.
источник
В рельсах 5 нам нужно добавить 2 строки кода
источник
Установка
может помочь
источник
Проблема решена снижением до 2.3.5 с 2.3.8. (а также печально известный вопрос «Вы перенаправлены».)
источник