Безопасность веб-приложений: Что такое CSRF-атаки и как защитить от них формы на сайте с помощью токенов?

CSRF (Cross-Site Request Forgery — межсайтовая подделка запроса) — это тип атаки, при которой злоумышленник вынуждает аутентифицированного пользователя выполнить нежелательное действие на доверенном сайте без его ведома. Атака эксплуатирует тот факт, что браузер автоматически отправляет cookies и другие учётные данные вместе с каждым запросом к сайту, на котором пользователь авторизован.

## Как работает CSRF-атака?

Представьте, что вы авторизованы в интернет-банке. Злоумышленник создаёт вредоносную страницу с HTML-формой или изображением, скрытно отправляющим запрос на перевод денег в ваш банк. Когда вы открываете эту страницу, браузер автоматически прикрепляет ваши cookies к запросу, и банк воспринимает его как легитимный. В результате операция выполняется от вашего имени без вашего согласия.

## Защита с помощью CSRF-токенов

Самый надёжный и распространённый способ защиты — использование CSRF-токенов (также называемых anti-CSRF tokens или synchronizer tokens).

**Принцип работы:**
1. При загрузке формы сервер генерирует уникальный случайный токен и сохраняет его в сессии пользователя.
2. Токен встраивается в HTML-форму как скрытое поле: «.
3. При отправке формы сервер сравнивает токен из запроса с токеном в сессии.
4. Если токены совпадают — запрос обрабатывается. Если нет — запрос отклоняется.

Злоумышленник не может получить токен, так как он не имеет доступа к содержимому страниц на вашем домене (политика Same-Origin Policy).

## Практическая реализация

**PHP-пример:**
php
// Генерация токена
$_SESSION[‘csrf_token’] = bin2hex(random_bytes(32));

// В форме
echo »;

// Проверка при обработке
if (!hash_equals($_SESSION[‘csrf_token’], $_POST[‘csrf_token’])) {
die(‘CSRF-атака обнаружена!’);
}

**Дополнительные меры защиты:**
— **SameSite Cookie**: установите атрибут `SameSite=Strict` или `SameSite=Lax` для cookies, чтобы они не отправлялись при межсайтовых запросах.
— **Проверка заголовка Referer/Origin**: сервер проверяет, что запрос пришёл с доверенного домена.
— **Double Submit Cookie**: токен одновременно хранится в cookie и передаётся в теле запроса.
— **Использование фреймворков**: большинство современных фреймворков (Laravel, Django, Rails, Spring) имеют встроенную CSRF-защиту.

## Важные рекомендации

— Токен должен быть криптографически случайным и достаточно длинным (минимум 128 бит).
— Генерируйте новый токен для каждой сессии или даже для каждого запроса.
— Никогда не передавайте токены в URL — они могут попасть в логи сервера.
— Для AJAX-запросов передавайте токен в заголовке HTTP (например, `X-CSRF-Token`).

Правильная реализация CSRF-защиты — обязательный элемент безопасности любого веб-приложения, работающего с аутентификацией пользователей.


Задайте вопрос нейросети

Не нашли ответ? Спросите ИИ — он подготовит развёрнутую статью.