Yii2. Использование csrf-токенов


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

Фреймворк Yii2 дает прекрасные возможности по работе с csrf-токенами, при этом их проверка включена по умолчанию. Это означает, что простое использование html-формы

приведет к появлению ошибки

Bad Request (#400): Unable to verify your data submission

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

'components' => [
     'request' => [
          ....
          'enableCsrfValidation'=>false,
      ],
      .....
],

Это отключит csrf-валидацию для всего приложения. Если же Вам нужно отключить проверку csrf-токенов в каком-то конкретном месте - используйте следующий код в контроллере:

$this->enableCsrfValidation = false;

При всей простоте и очевидности настоятельно не рекомендую отключать и/или обходить проверку csrf. Любая уязвимость, а csrf является именно таковой, - это потенциальное место возникновения проблем с Вашим сайтом и следовательно Вы, своими же руками, их создаете.

Как говорится, не надо так..

Далее о хорошем, о том, как же следует использовать возможности Yii2 в работе с csrf.

Наиболее оптимальный вариант - использовать нативные возможности фреймворка.
Это методы ActiveForm::begin() и Html:beginForm()

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

Если же Вы вынуждены использовать форму без обертки фреймворка - Вам подойдет следующий вариант:

< form action='#' method='POST'>
   <input type="hidden" name="<?=Yii::$app->request->csrfParam; ?>" value="<?=Yii::$app->request->getCsrfToken(); ?>" />
   ....
< /form>

Как видите, имя и значение поля, которые будут использоваться при валидации можно получить вручную, обращаясь к базовым компонентам приложения.

Но и это не все 🙂

Очень большая уязвимость - незащищенные ajax-запросы, при помощи которых злоумышленник может нанести вред Вашему сайту. Но доблестный Yii2 и здесь не оставляет нас в беде.
Для того, чтобы правильно защитить наши асинхронные запросы выполните два следующих действия:
Во-первых, в Вашем слое, точнее в его head-части, добавьте следующий код:

Это выведет meta-теги с названием и значением наших csrf-параметров.
После этого Вы, при помощи JavaScript можете получить доступ к этим значениям. Например, вот так:

var csrfParam = $('meta[name="csrf-param"]').attr("content");
var csrfToken = $('meta[name="csrf-token"]').attr("content");
$.ajax({
         url: 'http://onfor.info/any.php',
         type: 'post',
         dataType: 'json',
         data: {param1: param1, csrfParam : csrfToken},
});

Как Вы видите, нам нужно просто обратиться к meta-тегам и забрать с них название и значение нужных csrf-параметров. Далее фреймворк все сделает сам.

На это все. На самом деле вопрос о создании/проверке подлинности csrf очень широк и сложен. Есть множество вариантов реализации и даже в разрезе использования Yii2 есть множество нераскрытых в этой статье нюансов. Но, для большинства случаев приведенных примеров более чем достаточно.

,

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *