Как защитить форму токеном CSRF
Короткий ответ
Сохраните случайный токен в сессии и вставьте его в скрытое поле формы:
<?php
session_start();
$_SESSION['csrf'] ??= bin2hex(random_bytes(32));
echo '<input type="hidden" name="csrf" value="' . $_SESSION['csrf'] . '">';Проверка при отправке
Сравните присланное значение с сохранённым:
<?php
session_start();
if (!hash_equals($_SESSION['csrf'] ?? '', $_POST['csrf'] ?? '')) {
http_response_code(403);
exit('Invalid token');
}Зачем это нужно
Без токена чужой сайт может отправить форму от имени вошедшего пользователя: браузер сам приложит его cookie. Токен чужому сайту неизвестен.
Функции из этого ответа
- random_bytes — Возвращает случайные байты, пригодные для защиты.
- hash_equals — Сравнивает две строки за одинаковое время.
- session_start — Запускает сессию или продолжает существующую.