Ниже ошибка, вызванная формой в моем приложении направляющих:
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
есть ли.
Токен подлинности - это случайное значение, сгенерированное в вашем представлении, чтобы доказать, что запрос отправлен из формы на вашем сайте, а не где-то еще. Это защищает от CSRF-атак:
http://en.wikipedia.org/wiki/Cross-site_request_forgery
Проверьте, кто этот клиент/IP, похоже, что они используют ваш сайт, не загружая ваши представления.
Если вам нужно отлаживать дальше, этот вопрос - хорошее место для начала: Understanding the Rails Authenticity Token
Edited to explain: Это означает, что они вызывают действие для обработки отправки вашей формы, никогда не отображая форму на вашем сайте. Это может быть вредоносным (например, публикация спам-комментариев) или указывать на то, что клиент пытается напрямую использовать API вашего веб-сервиса. Только вы можете ответить на этот вопрос, исходя из характера вашего продукта и анализируя ваши запросы.
У меня была та же проблема, но со страницами, которые были кэшированы. Страницы буферизуются с устаревшим токеном аутентификации, и все действия с использованием методов 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, который не использует данные сеанса.