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

666   17  

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_to etc. в противном случае токен будет несвежим / недействительным.

Я не хотел бы аннулировать защиту 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="&#x2713;">
    <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

установка

gem 'remotipart' 

может поможет

У меня была такая же проблема на localhost. Я изменил домен для приложения, но в URL-адресах и hosts-файле все еще был старый домен. Обновил свой браузер, закладки и hosts-файл, чтобы использовать новый домен и теперь все работает нормально.

Я проверил присутствуют и очистка куки в браузере работал для меня.

проблема решена путем понижения до 2.3.5 с 2.3.8. (а также печально известный " вы перенаправлены. вопрос)

Comments

    Ничего не найдено.