Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое CSRF-защита?
CSRF (Cross-Site Request Forgery, или Межсайтовая Подделка Запроса) — это тип атаки на веб-приложения, при котором злоумышленник заставляет авторизованного пользователя выполнить нежелательные действия в доверенном веб-приложении без его ведома. Атака возможна, когда приложение не проверяет, действительно ли запрос был инициирован самим пользователем, а не сторонним сайтом. CSRF-защита — это комплекс мер, направленных на предотвращение таких атак, обычно путем добавления уникальных токенов в запросы.
Как работает CSRF-атака?
Представьте, что пользователь авторизован в банковском приложении на bank.com. Затем он посещает вредоносный сайт evil.com, который содержит скрытую форму или JavaScript-код, отправляющий запрос на bank.com для перевода денег. Браузер автоматически включает куки сессии с bank.com, и запрос выглядит легитимным для сервера, так как исходит от авторизованного пользователя. Пример вредоносного кода:
<!-- На сайте evil.com -->
<form action="https://bank.com/transfer" method="POST">
<input type="hidden" name="amount" value="1000">
<input type="hidden" name="toAccount" value="attacker">
</form>
<script>document.forms[0].submit();</script>
Основные методы CSRF-защиты
В PHP Backend для защиты от CSRF чаще всего используются следующие подходы:
-
CSRF-токены (синхронизаторы):
- Генерация уникального токена для каждой сессии пользователя.
- Включение токена в формы (как скрытое поле) или в заголовки AJAX-запросов.
- Проверка токена на сервере при обработке POST, PUT, DELETE и других изменяющих запросов.
Пример реализации в PHP:
// Генерация токена при старте сессии
session_start();
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
// Вставка токена в форму
?>
<form method="POST" action="/transfer">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
<!-- Остальные поля формы -->
</form>
<?php
// Проверка токена на сервере
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die('CSRF validation failed!');
}
// Обработка запроса
}
-
SameSite cookies:
- Использование атрибута
SameSiteдля кук сессии. УстановкаSameSite=StrictилиSameSite=Laxпредотвращает отправку кук в cross-site запросах. - Пример установки в PHP:
setcookie('session_id', $value, ['samesite' => 'Strict', 'secure' => true]);.
- Использование атрибута
-
Проверка заголовка Referer/Origin:
- Сервер может проверять, что запрос пришел с ожидаемого домена (например, с
bank.com, а не сevil.com). - Однако этот метод не надежен, так как заголовки могут быть отключены в браузерах или подделаны.
- Сервер может проверять, что запрос пришел с ожидаемого домена (например, с
-
Двойная отправка токенов:
- Токен хранится как в куках, так и в теле запроса (например, в форме). Сервер сверяет оба значения.
- Этот подход удобен для одностраничных приложений (SPA), где токен можно отправлять в заголовках.
Практические рекомендации для PHP Backend
- Всегда используйте CSRF-токены для state-changing операций (POST, PUT, PATCH, DELETE). Для GET-запросов защита обычно не требуется, так как они не должны изменять данные.
- Регенерируйте токен после каждой успешной проверки или при смене состояния сессии, чтобы предотвратить replay-атаки.
- Комбинируйте методы: например, CSRF-токены + SameSite cookies для усиленной защиты.
- Внедряйте защиту на уровне фреймворка, если используете Laravel, Symfony и т.д. В них CSRF-защита встроена по умолчанию. В Laravel, например, токен добавляется через директиву
@csrfв Blade-шаблонах. - Тестируйте защиту с помощью инструментов безопасности, таких как OWASP ZAP или Burp Suite.
Пример защиты в современных PHP-фреймворках
В Laravel CSRF-защита активирована глобально для всех маршрутов, кроме тех, что исключены явно. Middleware VerifyCsrfToken автоматически проверяет токен:
// В форме Blade
<form method="POST" action="/profile">
@csrf
<input type="text" name="name">
</form>
// Для AJAX-запросов токен можно включить в мета-тег
<meta name="csrf-token" content="{{ csrf_token() }}">
// И отправить в заголовке X-CSRF-TOKEN
Итог: CSRF-защита критически важна для безопасности веб-приложений, так как предотвращает несанкционированные действия от лица пользователя. В PHP-разработке она достигается через токены, правильную конфигурацию кук и проверку источников запросов. Пренебрежение этими мерами может привести к финансовым потерям, утечке данных и репутационным рискам.