Как определить токен CSRF в вызове ajax в Cakephp 3. Также, как CSRF может быть отключен для некоторых запросов ajax

В Cakephp3, когда компонент Csrf включен. Как я могу использовать его в AJAX-вызов. В этом beforeSend параметр токена ajax csrf установлен в заголовке. Что такое значение csrfToken. Как это дает error

csrfToken не определен

beforeSend: function(xhr){
    xhr.setRequestHeader('X-CSRF-Token', csrfToken);
},

также, как я могу отключить компонент Csrf для некоторых вызовов ajax.

3 ответов


компонент CSRF записывает текущий токен в параметры запроса как _csrfToken, вы можете получить его через объекты запроса param() метод (или getParam() по состоянию на CakePHP 3.4):

setRequestHeader('X-CSRF-Token', <?= json_encode($this->request->param('_csrfToken')); ?>);

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

public function beforeFilter(\Cake\Event\Event $event)
{
    parent::beforeFilter($event);

    if ($this->request->param('action') === 'actionXyz') {
        $this->eventManager()->off($this->Csrf);
    }
}

см. также


каждая форма имеет скрытый _csrfToken поле, которое автоматически добавляется при включении компонента Csrf. Теперь вы можете легко получить токен этого поля с помощью jquery, например $('[name="_csrfToken"]').val().

вызов ajax будет выглядеть так:

$.ajax({
   url: 'someUrl',
   headers : {
      'X-CSRF-Token': $('[name="_csrfToken"]').val()
   },
   type: 'post',
   ...
});

CakePHP 3

пожалуйста, не разблокируйте поля/отключите компонент безопасности CSRF для любого конкретное действие. Это важно для безопасности формы.

для тех, кто получает "запрос был черный-продырявить." , "ошибка подделки формы", " вы не имеете права доступа это расположение." или "неожиданных местах в POST data". Это главным образом из-за того, что компонент CSRF работает так, как ожидалось.

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

var el = $("#xyzForm");

var ajaxTPCalls = el.serializeArray();
  $.ajax({
                            type: el.attr('method'),
                            async: true,
                            url:  el.attr('action'),
                            data: ajaxTPCalls,
                            dataType: "json",
                            cache: false,
                            success: function (data) {

                                toastr.success(data.message, data.title);
                            },
                            error: function (jqXHR) {
                                if (jqXHR.status == 403) {
                                    $("body").html(jqXHR.responseText);
                                }
                            }
                        });

таким образом, вы не отключаете CSRF или не разблокируете какое-либо поле.