ActionController::InvalidAuthenticityToken
Ниже приведена ошибка, вызванная формой в моем приложении Rails:
Processing UsersController#update (for **ip** at 2010-07-29 10:52:27) [PUT]
Parameters: {"commit"=>"Update", "action"=>"update", "_method"=>"put", "authenticity_token"=>"ysiDvO5s7qhJQrnlSR2+f8jF1gxdB7T9I2ydxpRlSSk=", **more parameters**}
ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):
это происходит для каждого номера-get запрос и, как видите, authenticity_token есть.
17 ответов:
у меня была та же проблема, но со страницами, которые были кэшированы страницы. Страницы были буферизованы устаревшим маркером подлинности и все действия с использованием методов post/put / delete, где распознаются как попытки подделки. Ошибка (422 необработанных объекта) была возвращена пользователю.
решение:
Добавить:skip_before_filter :verify_authenticity_tokenили как" сагиво " указал в рельсы 4 Добавить:
skip_before_action :verify_authenticity_tokenна страницах, которые делают кэширование.
как прокомментировал @toobulkeh это не a уязвимость на
: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
для меня причиной этой проблемы под Rails 4 было отсутствие,
<%= csrf_meta_tags %>строка в моем основном макете приложения. Я случайно удалил его, когда переписывал свой макет.
Если это не в основном макете, вам понадобится это на любой странице, на которой вы хотите использовать токен CSRF.
есть несколько причин для этой ошибки, (относящиеся к рельсам 4).
1. Проверьте<%= csrf_meta_tags %>в макете присутствуют страницы
2. проверка подлинности маркер отправляется с AJAX-вызовов при использованииform_forпомощник с .Если нет, вы можете включить строку<%= hidden_field_tag :authenticity_token, form_authenticity_token %>в форме блока.
3. Если запрос отправляется с кэшированной страницы, Используйте кэширование фрагментов чтобы исключить часть страницы, которая отправляет запрос, напримерbutton_toetc. в противном случае токен будет несвежим / недействительным.Я не хотел бы аннулировать защиту csrf...
маркер подлинности-это случайное значение, сгенерированное в вашем представлении, чтобы доказать, что запрос отправлен из формы на вашем сайте, а не где-то еще. Это защищает от атак CSRF:
http://en.wikipedia.org/wiki/Cross-site_request_forgery
проверьте, кто этот клиент / IP, похоже, что они используют ваш сайт без загрузки ваших представлений.
Если вам нужно отлаживать дальше, этот вопрос является хорошим местом для начала: понимание маркера подлинности Rails
редактировать объяснить: Это означает, что они вызывают действие для обработки вашей формы отправки, никогда не представляя вашу форму на вашем веб-сайте. Это может быть вредоносным (например, размещение комментариев спама) или может указывать на то, что клиент пытается напрямую использовать API веб-службы. Вы единственный, кто может ответить на это по характеру вашего продукта и анализа ваших запросов.
просто добавив
authenticity_tokenв форме исправил это для меня.<%= hidden_field_tag :authenticity_token, form_authenticity_token %>
слишком поздно, чтобы ответить, но я нашел решение.
когда вы определяете свою собственную html-форму, вы пропускаете строку маркера аутентификации, которая должна быть отправлена контроллеру по соображениям безопасности. Но когда вы используете rails form helper для создания формы, вы получаете что-то вроде следующего
<form accept-charset="UTF-8" action="/login/signin" method="post"> <div style="display:none"> <input name="utf8" type="hidden" value="✓"> <input name="authenticity_token" type="hidden" value="x37DrAAwyIIb7s+w2+AdoCR8cAJIpQhIetKRrPgG5VA="> . . . </div> </form>таким образом , решение проблемы заключается либо в добавлении поля authenticity_token, либо в использовании помощников формы rails, а не в удалении, понижении или обновлении rails.
Если вы сделали
rake rails:updateили иначе недавно изменил свойconfig/initializers/session_store.rb, это может быть признаком старых куки в браузере. Надеюсь, это сделано в dev/test (это было для меня), и вы можете просто очистить все файлы cookie браузера, связанные с рассматриваемым доменом.Если это в производстве, и вы изменили
key, подумайте об изменении его обратно, чтобы использовать старые куки (
У меня была эта проблема с вызовами javascript. Я исправил это, просто потребовав jquery_ujs в приложение.js файл.
ActionController::InvalidAuthenticityTokenтакже может быть вызвано неверно настроенным обратным прокси. Это тот случай, если в трассировке стека вы получаете строку, похожую наRequest origin does not match request base_url.при использовании обратного прокси-сервера (например, nginx) в качестве приемника для HTTPS-запроса и передачи незашифрованного запроса на серверную часть (например, приложение Rails), серверная часть (более конкретно: Rack) ожидает некоторые заголовки с дополнительной информацией об исходном запросе клиента, чтобы иметь возможность применять различные задачи обработки и меры безопасности.
более подробная информация доступна здесь: https://github.com/rails/rails/issues/22965.
TL; DR: решение состоит в том, чтобы добавить некоторые заголовки:
upstream myapp { server unix:///path/to/puma.sock; } ... location / { proxy_pass http://myapp; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Ssl on; # Optional proxy_set_header X-Forwarded-Port $server_port; proxy_set_header X-Forwarded-Host $host; }
для рельсов 5, его лучше добавить
protect_from_forgery prepend: trueчем пропуститьverify_authentication_token
У нас была та же проблема, но заметил, что это было только для запросов с использованием http:// а не с https://. Причина была
secure: trueдля session_store:Rails.application.config.session_store( :cookie_store, key: '_foo_session', domain: '.example.com', secure: true )исправлено с помощью HTTPS ~везде :)
может быть, у вас есть настройка NGINX для HTTPS, но ваши сертификаты недействительны? У меня была аналогичная проблема в прошлом, и перенаправление с http на https решило проблему
у меня была эта проблема, и причина была в том, что я скопировал и вставил контроллер в свое приложение. Мне нужно было изменить
ApplicationControllerдоApplicationController::Base
У меня была такая же проблема на localhost. Я изменил домен для приложения, но в URL-адресах и hosts-файле все еще был старый домен. Обновил свой браузер, закладки и hosts-файл, чтобы использовать новый домен и теперь все работает нормально.
проблема решена путем понижения до 2.3.5 с 2.3.8. (а также печально известный " вы перенаправлены. вопрос)
Comments