Как определить токен 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 или не разблокируете какое-либо поле.