This document is for a version of CakePHP that is no longer supported. Please upgrade to a newer release!

Межсайтовая подделка запроса

Активируя компонент CSRF вы получаете защиту от атак. CSRF или Межсайтовая подделка запросов является распространенной уязвимостью в веб-приложениях. Он позволяет злоумышленнику захватывать и воспроизводить предыдущий запрос, а иногда и отправлять запросы данных с использованием тегов изображений или ресурсов в других доменах.

Компонент CsrfComponent работает, устанавливая куки в браузер пользователя. При создании формы с помощью Cake\View\Helper\FormHelper, добавляется скрытое поле с токеном CSRF. Во время события Controller.startup если запрос является POST, PUT, DELETE, PATCH запросом, компонент сравнит данные запроса со значением хранящимся в куки. Если какое-либо из этих значений будет отсутствовать или же два значения не совпадут, компонент выбросит исключение Cake\Network\Exception\InvalidCsrfTokenException.

Примечание

Вы всегда должны проверять используемый HTTP-метод перед выполнением во избежание побочных эффектов. Вы должны проверять HTTP-vtnjl или использовать Cake\Http\ServerRequest::allowMethod() чтобы удостовериться, что используется правильный HTTP-метод.

Добавлено в версии 3.1: Изменен тип выбрасываемого исключения с Cake\Network\Exception\ForbiddenException на Cake\Network\Exception\InvalidCsrfTokenException.

Не рекомендуется, начиная с версии 3.5.0: Вы должны использовать Cross Site Request Forgery (CSRF) Middleware вместо CsrfComponent.

Использование CsrfComponent

Просто добавляя CsrfComponent в массив ваших компонентов, вы можете получить выгоду от CSRF-защиты, которую он предоставляет:

public function initialize()
{
    parent::initialize();
    $this->loadComponent('Csrf');
}

Параметры могут быть переданы в компонент через настройки вашего компонента. Доступные параметры конфигурации:

  • cookieName Имя отправляемой куки-переменной. По умолчанию csrfToken.

  • expiry Продолжительность жизни токена CSRF. По умолчанию равен продолжительности сессии браузера. Принимает значения strtotime с версии 3.1

  • secure Будет ли cookie установлен с флагом Secure. То есть, cookie будет установлен только при HTTPS-соединении, и любая попытка по обычному HTTP не удастся. По умолчанию используется false.

  • field Поле формы для проверки. По умолчанию _csrfToken. Изменение данного параметра потребует также перенастройки хелпера FormHelper.

Когда включено, вы можете получить доступ к текущему токену CSRF в объекте запроса:

$token = $this->request->getParam('_csrfToken');

Интеграция с FormHelper

CsrfComponent легко интегрируется с FormHelper. Каждый раз, когда вы создаете форму с помощью FormHelper, она вставляет скрытое поле, содержащее токен CSRF.

Примечание

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

CSRF-защита и AJAX-запросы

Помимо параметров запроса данных, токены CSRF могут быть отправлены через специальный заголовок X-CSRF-Token. Использование заголовка часто упрощает интеграцию токена CSRF с тяжелыми приложениями JavaScript или конечными точками API на основе XML/JSON.

Отключение компонента CSRF для определенных экшенов

Хотя это не рекомендуется, вы можете отключить CsrfComponent для определенных запросов. Вы можете сделать это, используя диспетчер событий контроллера, во время выполнения метода beforeFilter()

public function beforeFilter(Event $event)
{
    $this->eventManager()->off($this->Csrf);
}