ActionController :: InvalidAuthenticityToken - PullRequest
127 голосов
/ 29 июля 2010

Ниже приведена ошибка, вызванная формой в моем приложении на 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 есть.

Ответы [ 19 ]

191 голосов
/ 29 августа 2010

У меня была такая же проблема, но со страницами, которые были кэшированы. Страницы буферизировались с использованием устаревшего токена подлинности и всех действий с использованием методов 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"

72 голосов
/ 06 ноября 2013

Для меня причиной этой проблемы в Rails 4 была пропущенная строка

<%= csrf_meta_tags %>

в макете моего основного приложения.Я случайно удалил его, когда переписал свой макет.

Если его нет в основном макете, он понадобится вам на любой странице, на которой требуется токен CSRF.

56 голосов
/ 24 июня 2015

Существует несколько причин этой ошибки (относится к Rails 4).

1. Проверьте <%= csrf_meta_tags %> присутствует в макете страницы

2. проверьте, чтобы токен аутентификации отправлялся с вызовами AJAX при использовании помощника form_for с опцией remote: true. Если вы не можете включить строку <%= hidden_field_tag :authenticity_token, form_authenticity_token %> в блоке формы.

3. Если запрос отправляется с кэшированной страницы, используйте фрагментное кэширование , чтобы исключить часть страницы, которая отправляет запрос, например, button_to и т. Д., В противном случае токен будет устаревшим / недействительным.

Я бы не хотел отменять защиту CSRF ...

30 голосов
/ 29 июля 2010

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

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

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

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

28 голосов
/ 10 декабря 2016

Просто добавление authenticity_token в форму исправило это для меня.

<%= hidden_field_tag :authenticity_token, form_authenticity_token %>
16 голосов
/ 06 июля 2014

слишком поздно, чтобы ответить, но я нашел решение.

Когда вы определяете свою собственную html-форму, вы пропускаете строку токена аутентификации, которая должна быть отправлена ​​на контроллер по соображениям безопасности. Но когда вы используете rails form helper для генерации формы, вы получаете что-то вроде следующего:

<form accept-charset="UTF-8" action="/login/signin" method="post">
  <div style="display:none">
    <input name="utf8" type="hidden" value="&#x2713;">
    <input name="authenticity_token" type="hidden" 
      value="x37DrAAwyIIb7s+w2+AdoCR8cAJIpQhIetKRrPgG5VA=">
    .
    .
    .
  </div>
</form>

Таким образом, решение проблемы состоит в том, чтобы либо добавить поле authenticity_token, либо использовать помощники форм рельсов, чем удалять, понижать или обновлять рельсы.

11 голосов
/ 30 июня 2018

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;
}
6 голосов
/ 14 октября 2015

Если вы сделали rake rails:update или иным образом недавно изменили config/initializers/session_store.rb, это может быть признаком старых файлов cookie в браузере. Надеюсь, это сделано в dev / test (это было для меня), и вы можете просто очистить все куки браузера, связанные с доменом.

Если это в работе, и вы изменили key, рассмотрите возможность его изменения, чтобы использовать старые куки (<- только предположение).

4 голосов
/ 01 апреля 2014

У меня была эта проблема с вызовами JavaScript. Я исправил это, просто запросив jquery_ujs в файле application.js.

2 голосов
/ 15 марта 2018

Для рельсов 5 лучше добавить protect_from_forgery prepend: true, чем пропустить verify_authentication_token

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...