Rails 3.1 - CSRF игнорируется? - PullRequest
       8

Rails 3.1 - CSRF игнорируется?

10 голосов
/ 01 сентября 2011

вот моя проблема,

У меня есть приложение rails 3.1, и я пытаюсь сделать запрос ajax, но я получаю предупреждение "ВНИМАНИЕ: Не удается проверить подлинность токена CSRF"…

Внутри моего макета у меня есть вспомогательный метод " csrf_method_tag ​​", и я добавляю следующий код JavaScript (не знаю, действительно ли он требуется или нет):

$.ajaxSetup({
  beforeSend: function(xhr) {
    xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'));
  }
});

Мой Gemfile содержит гем jquery-rails (> = 1.0.12), и мне требуются jquery & jquery-ujs в верхней части моего application.js.

Даже с этим, сообщение все еще появляется.Я что-то забыл?

Спасибо за помощь.

Ответы [ 7 ]

9 голосов
/ 21 октября 2011

У меня была точно такая же проблема.Я пытался перехватить событие javascript (игрок you_tube завершен) и Ajax вернулся на мой сервер, чтобы сообщить мне об этом.Я получал:

<b>WARNING:</b> Can't verify CSRF token authenticity

всякий раз, когда вызов jQuery ajax попадает на мой сервер.Я добавил ваше исправление кода выше

$.ajaxSetup({
    beforeSend: function(xhr) {
        xhr.setRequestHeader('X-CSRF-Token',
                             $('meta[name="csrf-token"]').attr('content'));
    }
});

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

<%= csrf_meta_tags %>

, а не csrf_method_tag, как вы упомянули в исходном сообщении.
Так что спасибо за исправление, оно было в исходном сообщении.*

7 голосов
/ 28 сентября 2011

Что сработало для меня - при работе без форм - это включить результат <%= form_authenticity_token %> в полезные данные ajax.Поэтому я делаю что-то вроде того, что было предложено tehprofоресурсом в html:

<input id="tokentag" type="hidden" name="authenticity_token" value="<%= form_authenticity_token %>" />

, затем в javascript:

tokentag = $('#tokentag').val()
submitdata = { "authenticity_token": tokentag, ...+whatever else you need to include+...}

, затем вызываю $.ajax с submitdata.

7 голосов
/ 02 сентября 2011

Возможно, вам даже не нужно это в вашем коде.По умолчанию гем jquery-rails автоматически устанавливает токен CSRF для всех запросов Ajax.

1 голос
/ 22 июня 2012

Просто сделайте это прямо на вызове AJAX, и он будет работать правильно!

  $.ajax({
            type: //method,
            beforeSend: function(xhr){
                xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))
            },
            url: //parameter,
            dataType: 'html',
            success: function(data, textStatus, jqXHR) {
               // some code
            }
  });
0 голосов
/ 08 апреля 2013

Проблема в том, что вам нужно получить новый токен после запроса POST Ajax, потому что после использования токена он становится недействительным. Вот код для этого:

В рельсах всякий раз, когда отправляется ответ POST, добавьте следующие параметры в ответ:

def someMethod:
    result[:csrfParam] = request_forgery_protection_token
    result[:csrfToken] = form_authenticity_token
    render :json => result
end

Теперь на стороне JS, в функции успеха каждого метода POST вы можете вызвать эту функцию:

var setCsrfToken = function(param, token) {
    if(param == null || token == null) {
        console.error("New CSRF param/token not present");
    }
    $("input[name='" + param + "']").val(token);
}

как это:

setCsrfToken(result["csrfParam"], result["csrfToken"]);

Эта функция будет сбрасывать все параметры authenticity_token во всех формах POST, чтобы следующий запрос имел действительный токен. Вы должны убедиться, что это происходит при каждом вызове POST, иначе вы продолжите сталкиваться с этой проблемой.

Кроме того, CSRF не для предотвращения кликджекинга, это отдельная атака, когда другой веб-сайт может заставить пользователя щелкнуть ссылку, которая выполняет действие на вашем веб-сайте во время сеанса пользователя.

0 голосов
/ 04 января 2012

Одной из причин может быть то, что вы делаете вызов AJAX перед загрузкой документа, поэтому JQuery не может получить токен CSRF.

0 голосов
/ 17 сентября 2011

Вы пытались использовать скрытый элемент формы с токеном подлинности?

<input type="hidden" name="authenticity_token" value="<%= form_authenticity_token>" />

У меня была та же ошибка, и это помогло.Это потому, что я не использовал встроенные помощники форм ...

...