Для тех, кто еще не знаком с понятием CSRF токен:
csrf-токен (Cross-Site Request Forgery Token) — это защитный механизм в веб-разработке, предназначенный для предотвращения атак типа «Межсайтовая подделка запроса» (CSRF).
Принцип работы
- Сервер генерирует уникальный токен для каждой формы или сессии.
- Токен встраивается в форму как скрытое поле (
<input type="hidden" name="csrf_token" value="abc123...">
) или добавляется в заголовки (например, для AJAX). - При отправке формы сервер проверяет токен — если он не совпадает с ожидаемым, запрос отклоняется.
Yii2 имеет встроенную поддержку данного механизма, включенную по умолчанию.
Таким образом если вы будете использовать обычную HTML форму или обычный AJAX запрос для отправки данных на сервер, вы получите ошибку следующего содержания: Bad Request (#400): Unable to verify your data submission.
Эта ошибка возникает в том случае, если при отправке данных на сервер не было указано значение CSRF-токена в одном из параметров запроса.
Разумеется, вы можете отключить данную опцию (настройку) вашего приложения в конфигурационном файле yii-фреймворка или в текущем контроллере (обработчике запроса), но я категорически не советую вам этого делать.
Несколько способов использования CSRF токена
1. Используйте виджет для создания форм ActiveForm, чтобы автоматически включить в форму скрытое поле со значением CSRF токена;
<?php
use yii\bootstrap\ActiveForm;
$form = ActiveForm::begin(['id' => 'custom-form']);
echo $form->field($model, 'username')->textInput();
echo $form->field($model, 'password')->passwordInput();
ActiveForm::end();
2. Указывайте значение параметра CSRF токена в HTML форме;
<?php
use yii\helpers\Html;
echo Html::hiddenInput(\Yii::$app->getRequest()->csrfParam, \Yii::$app->getRequest()->getCsrfToken(), []);
3. С помощью функции csrfMetaTags() добавьте в шаблон мета-тег со значением CSRF токена для использования его в ajax-запросах;
<?php
use yii\helpers\Html;
echo Html::csrfMetaTags();
Для тех, кто не переживает о безопасности приложения (проекта), ниже привожу код для отключения проверки CSRF-токена.
<?php
// Отключение в конфигурационном файле
'components' => [
'request' => [
'enableCsrfValidation' => false,
],
],
// Отключение в контроллере
public function beforeAction($action)
{
$this->enableCsrfValidation = false;
return parent :: beforeAction($action);
}