Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как защитить форму токеном 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 — Запускает сессию или продолжает существующую.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.