CSRF
CSRF (Cross-Site Request Forgery, XSRF) — атака, где злоумышленник заставляет браузер жертвы отправить запрос на сайт, где жертва залогинена. Куки прикрепляются автоматически.
Пример атаки
<!-- на evil.com -->
<form action="https://bank.com/transfer" method="POST">
<input name="to" value="attacker">
<input name="amount" value="1000000">
</form>
<script>document.forms[0].submit()</script>
Если у жертвы валидная сессия bank.com → перевод пройдёт.
Защита
1. CSRF-токен (Synchronizer Token)
Сервер выдаёт токен, форма его передаёт скрытым полем, сервер проверяет.
<form action="/transfer" method="POST">
<input type="hidden" name="csrf" value="R4nd0mS3cr3t">
...
</form>
2. Double-Submit Cookie
Токен в куке И в поле формы. Сервер сверяет равенство. Не требует хранения на сервере.
3. SameSite куки
Set-Cookie: session=...; SameSite=Lax — куки не отправляются на cross-site запросы. См. SameSite.
4. Custom заголовок
Требовать X-Requested-With: XMLHttpRequest. Cross-origin form-запрос такой заголовок не пошлёт (только с CORS preflight → защита).
5. Origin/Referer проверка
if req.Origin != "https://bank.com" { reject }
Что не защищает
- HTTPS сам по себе — куки уходят по HTTPS так же автоматически
- CORS — CORS про чтение ответа, а не про блокировку запроса
- Капча — тоже нет, если сессия уже есть
Login CSRF
Атакующий залогинивает жертву в СВОЙ аккаунт. Потом жертва вводит там данные → они попадают атакующему. Защита: CSRF-токен даже на /login.