Я посылаю данные из представления на контроллер с AJAX, и я получил эту ошибку:
ВНИМАНИЕ: Невозможно проверить подлинность токена CSRF.
Я думаю, что я должен отправить этот токен с данными.
Кто-нибудь знает, как я могу это сделать?
Изменить: мое решение
Я сделал это, поместив следующий код в сообщение AJAX:
headers: {
'X-Transaction': 'POST Example',
'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
},
ruby-on-rails
jquery
csrf
kbaccouche
источник
источник
Ответы:
Вы должны сделать это:
Убедитесь, что у вас есть
<%= csrf_meta_tag %>
в вашем макетеДобавьте
beforeSend
ко всем запросам ajax, чтобы установить заголовок, как показано ниже:Для отправки токена во всех запросах вы можете использовать:
источник
Лучший способ сделать это на самом деле просто использовать
<%= form_authenticity_token.to_s %>
для распечатки токена непосредственно в коде rails. Вам не нужно использовать javascript для поиска в домене токена csrf, как упоминалось в других сообщениях. просто добавьте опцию заголовков, как показано ниже;источник
Если я правильно помню, вам нужно добавить следующий код в форму, чтобы избавиться от этой проблемы:
Не забудьте параметр.
источник
<%= token_tag(nil) %>
. Затем вы получаете автоматически сгенерированный токен.Действительно самый простой способ. Не беспокойтесь о смене заголовков.
Убедитесь, что у вас есть:
Просто сделайте скрытое поле ввода примерно так:
Или, если вы хотите JQuery AJAX сообщение:
источник
Переход от старого приложения к rails 3.1, включая метатег csrf, до сих пор не решает проблему. В блоге rubyonrails.org они дают несколько советов по обновлению, а именно эту строку jquery, которая должна быть в разделе head вашего макета:
взято из этого блога: http://weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-ruby-on-rails .
В моем случае сеанс сбрасывался при каждом запросе ajax. Добавление приведенного выше кода решило эту проблему.
источник
<%= csrf_meta_tag %>
в вашем макетеbeforeSend
чтобы включить токен csrf в запрос ajax для установки заголовка. Это требуется только дляpost
запросов.Код для чтения csrf-токена доступен в
rails/jquery-ujs
, так что imho проще всего его использовать следующим образом:источник
headers: { 'X-CSRF-Token': Rails.csrfToken() }
Я просто решил связать это здесь, так как статья содержит большую часть ответа, который вы ищете, и это также очень интересно
http://www.kalzumeus.com/2011/11/17/i-saw-an-extremely-subtle-bug-today-and-i-just-have-to-tell-someone/
источник
Ответы с наибольшим количеством голосов здесь верны, но не будут работать, если вы выполняете междоменные запросы, потому что сеанс будет недоступен, если вы явно не скажете jQuery пропустить cookie сеанса. Вот как это сделать:
источник
Вы можете написать это глобально как ниже.
Нормальный JS:
Сценарий кофе:
источник
упс ..
Я пропустил следующую строку в моем application.js
Я заменил его, и он работает ..
======= ОБНОВЛЕНО =========
Через 5 лет я вернулся с той же ошибкой, теперь у меня есть новый Rails 5.1.6 , и я снова нашел этот пост. Прямо как круг жизни.
Теперь проблема заключалась в том, что Rails 5.1 по умолчанию удалил поддержку jquery и jquery_ujs и добавил
Это делает следующие вещи:
Но почему он не включает токен csrf для запроса ajax? Если кто-то знает об этом подробно, просто прокомментируйте меня. Я ценю это.
В любом случае я добавил следующее в свой файл js, чтобы он работал (спасибо за другие ответы, которые помогут мне добраться до этого кода):
источник
jquery_ujs
. Это был трюк.Если вы не используете JQuery и использовать что - то вроде выборки API для запросов вы можете использовать следующую команду, чтобы получить
csrf-token
:document.querySelector('meta[name="csrf-token"]').getAttribute('content')
источник
Используйте jquery.csrf ( https://github.com/swordray/jquery.csrf ).
Rails 5.1 или более поздняя версия
Rails 5.0 или раньше
Исходный код
источник
//= require jquery.csrf
не сработает, верно? Вместо этого я использовал пакет JS файл сimport 'jquery.csrf'
в нем. Обратите внимание, что вам не нужно включать это с тегом пакета в ваших представлениях.Если вы используете javascript с jQuery для генерации токена в вашей форме, это работает:
Очевидно, вы должны иметь
<%= csrf_meta_tag %>
в своем макете Ruby.источник
Для тех из вас, кому нужен ответ не от jQuery, вы можете просто добавить следующее:
Очень простой пример может быть отправлен здесь:
источник
Я боролся с этой проблемой в течение нескольких дней. Любой вызов GET работал правильно, но все PUT-сообщения вызывали ошибку «Не удается проверить подлинность токена CSRF». Мой веб-сайт работал нормально, пока я не добавил сертификат SSL в nginx.
Я наконец наткнулся на эту недостающую строку в моих настройках nginx:
После добавления пропущенной строки «proxy_set_header X-Forwarded-Proto https;» все мои ошибки токена CSRF завершаются.
Надеюсь, это поможет кому-то, кто также бьет их головой о стену. ха-ха
источник
если кому-то нужна помощь, связанная с Uploadify и Rails 3.2 (как и я, когда я погуглил этот пост), этот пример приложения может быть полезен: https://github.com/n0ne/Uploadify-Carrierwave-Rails-3.2.3/blob/master /app/views/pictures/index.html.erb
также проверьте решение контроллера в этом приложении
источник
Я использую Rails 4.2.4 и не могу понять, почему я получаю:
У меня есть в макете:
В контроллере:
Invoking
tcpdump -A -s 999 -i lo port 3000
показывал устанавливаемый заголовок (несмотря на то, что не нужно было устанавливать заголовки с помощьюajaxSetup
- это уже было сделано):В конце концов, это не удалось, потому что у меня были отключены куки. CSRF не работает без включенных файлов cookie, поэтому это еще одна возможная причина, если вы видите эту ошибку.
источник