\n```\n\nЕсли пользователь посетил эту страницу, в его браузер автоматически отправляется POST-запрос на `bank.com`. Браузер добавит к этому запросу cookies авторизации, и банковское приложение выполнит перевод, считая запрос легальным.\n\n## Как защититься от CSRF?\n\n### 1. Использование **CSRF-токенов** (наиболее распространенный метод)\nПриложение генерирует уникальный, секретный токен для каждой сессии пользователя или для каждого запроса формы. Этот токен добавляется в формы как скрытое поле (``) или передается через заголовки запроса (для AJAX). При обработке запроса приложение проверяет наличие и корректность токена.\n\n```php\n// Пример генерации и проверки CSRF-токена в PHP\nsession_start();\n\nfunction generateCsrfToken() {\n if (empty($_SESSION['csrf_token'])) {\n $_SESSION['csrf_token'] = bin2hex(random_bytes(32));\n }\n return $_SESSION['csrf_token'];\n}\n\nfunction validateCsrfToken($token) {\n if (empty($_SESSION['csrf_token']) || $token !== $_SESSION['csrf_token']) {\n return false;\n }\n return true;\n}\n\n// В форме:\n
\n \">\n \n
\n\n// При обработке POST-запроса:\nif (!validateCsrfToken($_POST['csrf_token'])) {\n die('Ошибка CSRF: неверный токен.');\n}\n```\n\n### 2. Проверка заголовка **Origin** или **Referer**\nДля запросов, которые не могут быть отправлены из другого источника (например, POST), можно проверять заголовки `Origin` или `Referer`. Они должны соответствовать ожидаемому домену приложения. Однако этот метод не абсолютно надежен (заголовки могут отсутствовать или быть подделаны в некоторых браузерах).\n\n```php\n$allowedOrigin = 'https://bank.com';\nif ($_SERVER['REQUEST_METHOD'] === 'POST') {\n $origin = $_SERVER['HTTP_ORIGIN'] ?? $_SERVER['HTTP_REFERER'] ?? '';\n if (strpos($origin, $allowedOrigin) !== 0) {\n die('Неверный источник запроса.');\n }\n}\n```\n\n### 3. Использование **SameSite cookies**\nАтрибут `SameSite` для cookies позволяет ограничить отправку cookies только при запросах, инициированных с того же сайта. Значения:\n* **`SameSite=Strict`**: Cookies отправляются только при строго same-site запросах.\n* **`SameSite=Lax`**: Cookies отправляются при same-site запросах и при безопасных cross-site запросах (например, переход по ссылке).\n\n```php\n// Установка cookie с атрибутом SameSite в PHP 7.3+\nsetcookie('session_id', $sessionId, [\n 'expires' => time() + 3600,\n 'path' => '/',\n 'domain' => 'bank.com',\n 'secure' => true,\n 'httponly' => true,\n 'samesite' => 'Strict' // или 'Lax'\n]);\n```\n\n### 4. Дополнительные меры безопасности\n* **Для критических операций требуйте повторную аутентификацию** (например, ввод пароля для финансовой транзакции).\n* **Ограничивайте время жизни сессии** и используйте безопасные методы для ее завершения.\n* **Реализуйте логирование** всех критических действий для отслеживания подозрительных операций.\n* **Обязательно используйте HTTPS**, чтобы защитить передаваемые данные и cookies от перехвата.\n\n## Рекомендации для PHP Backend разработчика\n\nВ современных PHP фреймворках (Laravel, Symfony, Yii2) защита от CSRF обычно реализована \"из коробки\".\n* В **Laravel**: используется middleware `VerifyCsrfToken`, токен автоматически добавляется в формы через `@csrf` Blade-директиву.\n* В **Symfony**: компонент `Form` может генерировать и проверять CSRF-токены с помощью `CsrfTokenManager`.\n\n**Обязательно активируйте и используйте эти механизмы.** Для защиты API эндпоинтов, которые используют cookies для авторизации, также необходимо применять CSRF-токены или переходить на авторизацию по токенам (например, JWT), которая не зависит от cookies браузера и менее подвержена CSRF.\n\n**Вывод:** Защита от CSRF является обязательным элементом безопасности любого веб-приложения. Комбинация **CSRF-токенов** и **SameSite cookies** сегодня считается наиболее эффективной и надежной стратегией для предотвращения таких атак.","dateCreated":"2026-04-07T16:45:18.521646","upvoteCount":0,"author":{"@type":"Person","name":"deepseek-v3.2"}}}}
← Назад к вопросам

Что такое CSRF атака и как от неё защититься?

2.0 Middle🔥 192 комментариев
#API и веб-протоколы#Безопасность

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое CSRF атака?

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

Пример атаки:

  • Пользователь авторизован в банковском приложении на bank.com.
  • Злоумышленник создает страницу с таким кодом:
<!-- Страница на злоумышленника.com -->
<form action="https://bank.com/transfer" method="POST" id="maliciousForm">
    <input type="hidden" name="amount" value="1000">
    <input type="hidden" name="to_account" value="attacker_account">
</form>
<script>
    document.getElementById('maliciousForm').submit();
</script>

Если пользователь посетил эту страницу, в его браузер автоматически отправляется POST-запрос на bank.com. Браузер добавит к этому запросу cookies авторизации, и банковское приложение выполнит перевод, считая запрос легальным.

Как защититься от CSRF?

1. Использование CSRF-токенов (наиболее распространенный метод)

Приложение генерирует уникальный, секретный токен для каждой сессии пользователя или для каждого запроса формы. Этот токен добавляется в формы как скрытое поле (<input type="hidden">) или передается через заголовки запроса (для AJAX). При обработке запроса приложение проверяет наличие и корректность токена.

// Пример генерации и проверки CSRF-токена в PHP
session_start();

function generateCsrfToken() {
    if (empty($_SESSION['csrf_token'])) {
        $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
    }
    return $_SESSION['csrf_token'];
}

function validateCsrfToken($token) {
    if (empty($_SESSION['csrf_token']) || $token !== $_SESSION['csrf_token']) {
        return false;
    }
    return true;
}

// В форме:
<form method="POST">
    <input type="hidden" name="csrf_token" value="<?= generateCsrfToken() ?>">
    <!-- другие поля формы -->
</form>

// При обработке POST-запроса:
if (!validateCsrfToken($_POST['csrf_token'])) {
    die('Ошибка CSRF: неверный токен.');
}

2. Проверка заголовка Origin или Referer

Для запросов, которые не могут быть отправлены из другого источника (например, POST), можно проверять заголовки Origin или Referer. Они должны соответствовать ожидаемому домену приложения. Однако этот метод не абсолютно надежен (заголовки могут отсутствовать или быть подделаны в некоторых браузерах).

$allowedOrigin = 'https://bank.com';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $origin = $_SERVER['HTTP_ORIGIN'] ?? $_SERVER['HTTP_REFERER'] ?? '';
    if (strpos($origin, $allowedOrigin) !== 0) {
        die('Неверный источник запроса.');
    }
}

3. Использование SameSite cookies

Атрибут SameSite для cookies позволяет ограничить отправку cookies только при запросах, инициированных с того же сайта. Значения:

  • SameSite=Strict: Cookies отправляются только при строго same-site запросах.
  • SameSite=Lax: Cookies отправляются при same-site запросах и при безопасных cross-site запросах (например, переход по ссылке).
// Установка cookie с атрибутом SameSite в PHP 7.3+
setcookie('session_id', $sessionId, [
    'expires' => time() + 3600,
    'path' => '/',
    'domain' => 'bank.com',
    'secure' => true,
    'httponly' => true,
    'samesite' => 'Strict' // или 'Lax'
]);

4. Дополнительные меры безопасности

  • Для критических операций требуйте повторную аутентификацию (например, ввод пароля для финансовой транзакции).
  • Ограничивайте время жизни сессии и используйте безопасные методы для ее завершения.
  • Реализуйте логирование всех критических действий для отслеживания подозрительных операций.
  • Обязательно используйте HTTPS, чтобы защитить передаваемые данные и cookies от перехвата.

Рекомендации для PHP Backend разработчика

В современных PHP фреймворках (Laravel, Symfony, Yii2) защита от CSRF обычно реализована "из коробки".

  • В Laravel: используется middleware VerifyCsrfToken, токен автоматически добавляется в формы через @csrf Blade-директиву.
  • В Symfony: компонент Form может генерировать и проверять CSRF-токены с помощью CsrfTokenManager.

Обязательно активируйте и используйте эти механизмы. Для защиты API эндпоинтов, которые используют cookies для авторизации, также необходимо применять CSRF-токены или переходить на авторизацию по токенам (например, JWT), которая не зависит от cookies браузера и менее подвержена CSRF.

Вывод: Защита от CSRF является обязательным элементом безопасности любого веб-приложения. Комбинация CSRF-токенов и SameSite cookies сегодня считается наиболее эффективной и надежной стратегией для предотвращения таких атак.

Что такое CSRF атака и как от неё защититься? | PrepBro