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 }

Что не защищает

Login CSRF

Атакующий залогинивает жертву в СВОЙ аккаунт. Потом жертва вводит там данные → они попадают атакующему. Защита: CSRF-токен даже на /login.

См. также