Почему не отправляется csrf токен автоматически?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Почему не отправляется csrf токен автоматически?

Сообщение Brainfuck »

В проекте включена csrf-валидация. В лайауте есть $this->registerCsrfMetaTags(), но когда я отправляю ajax-запрос джаваскриптовым fetch у меня не прокидывается токен и не пускает запрос. Почему так происходит? Насколько я понимаю мета-теги должны автоматически во все запросы добавляться или нет?
Prooksius
Сообщения: 100
Зарегистрирован: 2019.01.17, 23:24

Re: Почему не отправляется csrf токен автоматически?

Сообщение Prooksius »

Если вы заметили, все формы, генерируемые через ActiveForm или Html-хелпер, уже содержат в себе эти параметры. В этом, как я понял, и заключается автоматизация, о которой вы говорите. Но в js-коде надо уже самостоятельно отправлять эти параметры.
Можно прописать у себя в js такой код:

Код: Выделить всё

let csrfParam = $('meta[name="csrf-param"]').attr("content");
let csrfToken = $('meta[name="csrf-token"]').attr("content");
И при вызове ajax пихать туда дополнительно и их помимо основного.
Artur_Hopf
Сообщения: 19
Зарегистрирован: 2019.02.28, 11:18

Re: Почему не отправляется csrf токен автоматически?

Сообщение Artur_Hopf »

Или без jquery:

Код: Выделить всё

var token = document.querySelector('meta[name="csrf-token"]').getAttribute('content');
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: Почему не отправляется csrf токен автоматически?

Сообщение Brainfuck »

Да нет. Речь не об этом. Я знаю как получить токен из JS. Я просто думал что он должен автоматически добавляться к запросу. Помнится в других проектах у меня так и происходило. Я не добавлял его в запрос вручную.
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: Почему не отправляется csrf токен автоматически?

Сообщение Brainfuck »

Кажется он в куках должен передаваться или в сессии
skynin
Сообщения: 400
Зарегистрирован: 2017.12.12, 10:09

Re: Почему не отправляется csrf токен автоматически?

Сообщение skynin »

Brainfuck писал(а): 2020.05.29, 19:20 Я просто думал что он должен автоматически добавляться к запросу. Помнится в других проектах у меня так и происходило. Я не добавлял его в запрос вручную.
Он отправляется автоматически только если использовать средства генерации Yii

Если же свой js код: fetch, jQuery, axios, и т.п. то всегда устанавливал его в глобальных параметрах используемой библиотеки, в заголовке для всех запросов.
бекенд Yii2 ищет его вначале в теле запроса. Если не находит ищет в заголовке.

Наверное вы просто не обратили на это внимание в других проектах. Работало - и ладно, незачем было копать как оно там работает.
Brainfuck писал(а): 2020.05.29, 19:20 Кажется он в куках должен передаваться или в сессии
Никак нет.

csrf указывает что страница была сгенерена именно Yii2, и таким образом защищает от запросов которые приходят с какой-то чужой страницы
В алгоритм генерации не вникал.
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: Почему не отправляется csrf токен автоматически?

Сообщение Brainfuck »

Окей, а как быть с DELETE-запросами? Они ведь тоже защищаются вроде. Но тела не имеют. Тут только в хедере прокидывать? Что-то у меня не получается так...
skynin
Сообщения: 400
Зарегистрирован: 2017.12.12, 10:09

Re: Почему не отправляется csrf токен автоматически?

Сообщение skynin »

Brainfuck писал(а): 2020.06.01, 08:37 Окей, а как быть с DELETE-запросами? Они ведь тоже защищаются вроде. Но тела не имеют. Тут только в хедере прокидывать? Что-то у меня не получается так...
я всегда в хеадере прокидываю
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Почему не отправляется csrf токен автоматически?

Сообщение unknownby »

А может попробовать по другому выполнить запрос? Ощущение, что обычная задача, а решают сложным способом :)

Код: Выделить всё

$js = "
$(document).ready(function(){

    $('#buttonID').on('click', function(e){
        $.ajax({
            type: 'POST',
            url: '".$model->url."', //нужный УРЛ
            success: function(result) {
                $('#IDS').html(result); //в нужном месте будет возвращаться $this->renderAjax из контроллера
            }
        });
    });

});
";
$this->registerJs($js);
skynin
Сообщения: 400
Зарегистрирован: 2017.12.12, 10:09

Re: Почему не отправляется csrf токен автоматически?

Сообщение skynin »

unknownby писал(а): 2020.06.01, 15:34 А может попробовать по другому выполнить запрос? Ощущение, что обычная задача, а решают сложным способом :)
Не знаю сложно ли :)
Вот, покопался в старом проекте (сейчас у нас SPA,csrf поэтому не используется никак)

Код: Выделить всё

function yiiCSRF(data, opts) {
	var res = {};
    Object.assign(res, data || {});
	res[$('meta[name="csrf-param"]').attr("content")] = $('meta[name="csrf-token"]').attr("content");
	return opts == 'json' ? (JSON.stringify(res)) : res;
}

let _csrf = Object.values(yiiCSRF())[0];
$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
  jqXHR.setRequestHeader('X-CSRF-Token', _csrf);
});
и все. выставляется при инициализации js фронтенда.
ко всем запросам с помощью jQuery будет добавляться нужное поле заголовка и значение.
функция yiiCSRF есть в yii.js, но так вообще гарантировано, даже если yii.js не подключен виджетом - будет работать.

у axios аналогичная есть.
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Почему не отправляется csrf токен автоматически?

Сообщение unknownby »

skynin писал(а): 2020.06.01, 19:02 Не знаю сложно ли :)
Вот, покопался в старом проекте (сейчас у нас SPA,csrf поэтому не используется никак)
Для чего тогда использовать фреймворк, если требуется самостоятельная передача csrf?
Нашел простое решение в первой ссылке гугла, по сути то, что человеку и надо было
При необходимости дополнительных параметров param1: param1. Как написал ранее Proksius

Код: Выделить всё

var csrfParam = $('meta[name="csrf-param"]').attr("content");
var csrfToken = $('meta[name="csrf-token"]').attr("content");
$.ajax({
         url: 'URL',
         type: 'post',
         dataType: 'json',
         data: {param1: param1, csrfParam : csrfToken},
});
У Brainfuck задача "при нажатии на кнопку выполнить какое-то действие", которое можно реализовать разными способами. А он взял и делает способом, который был в другом его проекте. Зачем только? :)
skynin
Сообщения: 400
Зарегистрирован: 2017.12.12, 10:09

Re: Почему не отправляется csrf токен автоматически?

Сообщение skynin »

unknownby писал(а): 2020.06.02, 08:52 Для чего тогда использовать фреймворк, если требуется самостоятельная передача csrf?
когда нужен свой js код.
unknownby писал(а): 2020.06.02, 08:52 Нашел простое решение в первой ссылке гугла, по сути то, что человеку и надо было
При необходимости дополнительных параметров param1: param1. Как написал ранее Proksius
можно и так. это тоже самое, выше ж писал - "в заголовке или теле передается".
но когда у тебя js часть уже наполовину SPA - зачем копипастить код к каждому запросу, когда можно выставить один раз заголовок для всех запросов :)

и примените приведенный вами "более простого" кода к GET запросам.
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
Ответить