Что такое CSRF
1️⃣ Как кратко ответить
CSRF (Cross-Site Request Forgery) — это уязвимость веб-приложений, при которой злоумышленник может заставить пользователя выполнить нежелательные действия на сайте, на котором он аутентифицирован, без его ведома. Это достигается путем отправки поддельного запроса от имени пользователя.
2️⃣ Подробное объяснение темы
CSRF, или Cross-Site Request Forgery, представляет собой тип атаки на веб-приложения, при котором злоумышленник обманом заставляет пользователя выполнить действия, которые он не намеревался выполнять. Это возможно, когда пользователь уже аутентифицирован на сайте, и злоумышленник использует его сессию для выполнения действий от его имени.
Как работает CSRF
Представьте, что вы вошли в свой банковский аккаунт и оставили вкладку открытой. В это время вы посещаете другой сайт, который злоумышленник контролирует. Этот сайт может содержать скрытую форму или скрипт, который автоматически отправляет запрос на ваш банковский сайт, используя ваши текущие сессионные куки. Поскольку вы уже аутентифицированы, ваш банк может принять этот запрос как легитимный.
Пример атаки CSRF
Рассмотрим пример, где злоумышленник хочет перевести деньги с вашего банковского счета:
-
Пользователь аутентифицирован на сайте банка.
- Пользователь вошел в свой аккаунт и его сессия активна.
-
Злоумышленник создает вредоносный сайт.
- На этом сайте размещен код, который отправляет POST-запрос на сайт банка для перевода денег.
-
Пользователь посещает вредоносный сайт.
- Пользователь, не подозревая об опасности, открывает сайт злоумышленника.
-
Автоматическая отправка запроса.
- Вредоносный сайт автоматически отправляет запрос на сайт банка, используя сессионные куки пользователя.
-
Банк обрабатывает запрос.
- Поскольку запрос содержит действительные куки, банк выполняет перевод денег.
Защита от CSRF
Чтобы защититься от CSRF-атак, разработчики могут использовать несколько методов:
-
CSRF-токены: Каждый запрос, изменяющий состояние, должен содержать уникальный токен, который генерируется сервером и проверяется при получении запроса. Это предотвращает автоматическую отправку поддельных запросов, так как злоумышленник не знает токен.
-
Проверка реферера: Сервер может проверять заголовок
RefererилиOrigin, чтобы убедиться, что запрос исходит с доверенного домена. -
SameSite куки: Установка атрибута
SameSiteдля куки может ограничить их отправку только с запросами, идущими с того же сайта.
Пример кода с CSRF-токеном
// Генерация CSRF-токена на сервере
String csrfToken = UUID.randomUUID().toString();
session.setAttribute("csrfToken", csrfToken);
// Включение CSRF-токена в форму
<form action="/transfer" method="POST">
<input type="hidden" name="csrfToken" value="${csrfToken}">
<input type="text" name="amount" placeholder="Amount">
<input type="submit" value="Transfer">
</form>
// Проверка CSRF-токена на сервере при получении запроса
String sessionToken = (String) session.getAttribute("csrfToken");
String requestToken = request.getParameter("csrfToken");
if (sessionToken == null || !sessionToken.equals(requestToken)) {
throw new SecurityException("CSRF token mismatch");
}
- Генерация CSRF-токена: На сервере создается уникальный токен, который сохраняется в сессии пользователя.
- Включение токена в форму: Токен добавляется в скрытое поле формы, чтобы он отправлялся вместе с запросом.
- Проверка токена: При получении запроса сервер сравнивает токен из сессии с токеном из запроса. Если они не совпадают, запрос отклоняется.
CSRF — это серьезная угроза для безопасности веб-приложений, но с правильными мерами предосторожности ее можно эффективно предотвратить.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться