Активируя компонент 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
в массив ваших компонентов, вы
можете получить выгоду от 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');
CsrfComponent
легко интегрируется с FormHelper
. Каждый раз, когда вы
создаете форму с помощью FormHelper
, она вставляет скрытое поле, содержащее
токен CSRF.
Примечание
При использовании CsrfComponent
вы всегда должны создавать формы,
используя FormHelper
. В противном случае, вам все время придется вручную
создавать скрытые поля ввода в каждой вашей форме.
Помимо параметров запроса данных, токены CSRF могут быть отправлены через
специальный заголовок X-CSRF-Token
. Использование заголовка часто упрощает
интеграцию токена CSRF с тяжелыми приложениями JavaScript или конечными точками
API на основе XML/JSON.
Хотя это не рекомендуется, вы можете отключить CsrfComponent
для определенных
запросов. Вы можете сделать это, используя диспетчер событий контроллера, во время
выполнения метода beforeFilter()
public function beforeFilter(Event $event)
{
$this->eventManager()->off($this->Csrf);
}