ActionController:: InvalidAuthenticityToken

Ниже ошибка, вызванная формой в моем приложении направляющих:

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 есть ли.

127
задан Flip 17 November 2015 в 10:54
поделиться

2 ответа

Токен подлинности - это случайное значение, сгенерированное в вашем представлении, чтобы доказать, что запрос отправлен из формы на вашем сайте, а не где-то еще. Это защищает от CSRF-атак:

http://en.wikipedia.org/wiki/Cross-site_request_forgery

Проверьте, кто этот клиент/IP, похоже, что они используют ваш сайт, не загружая ваши представления.

Если вам нужно отлаживать дальше, этот вопрос - хорошее место для начала: Understanding the Rails Authenticity Token

Edited to explain: Это означает, что они вызывают действие для обработки отправки вашей формы, никогда не отображая форму на вашем сайте. Это может быть вредоносным (например, публикация спам-комментариев) или указывать на то, что клиент пытается напрямую использовать API вашего веб-сервиса. Только вы можете ответить на этот вопрос, исходя из характера вашего продукта и анализируя ваши запросы.

31
ответ дан 24 November 2019 в 00:41
поделиться

У меня была та же проблема, но со страницами, которые были кэшированы. Страницы буферизуются с устаревшим токеном аутентификации, и все действия с использованием методов post/put/delete распознаются как попытки подделки. Пользователю возвращена ошибка (422 Unprocessable Entity).

Решение для Rails 3:
Добавить:

 skip_before_filter :verify_authenticity_token  

или, как указано в «sagivo» в 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, который не использует данные сеанса.

194
ответ дан 24 November 2019 в 00:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: