CSRF – Cross-Site Request Forgery

CSRF (Cross-Site Request Forgery), je typ zranitelnosti webových aplikací, při které útočník může přimět přihlášeného uživatele, aby nechtěně provedl nějakou akci, třeba i mazání dat.

CSRF využívá toho, že prohlížeč automaticky posílá s HTTP požadavkem cookies na web aplikaci, na kterou se utočí.

Co je CSRF?

CSRF využívá toho, že prohlížeč automaticky posílá například cookies s požadavkem na web.

Například uživatel je přihlášený na:

https://example.cz

Útočník vytvoří stránku, která se pokusí odeslat požadavek na tento web:

<form action="https://example.cz/change-email" method="POST"> <input type="hidden" name="email" value="utocnik@example.com"> </form> <script> document.forms[0].submit(); </script>

Pokud aplikace nemá ochranu proti CSRF, prohlížeč může k požadavku automaticky připojit autentizační cookie. Server potom může požadavek považovat za legitimní akci uživatele.

V čem je CSRF nebezpečné?

Záleží na tom, jaké operace aplikace umožňuje. Útočník může například:

  • změnit e-mail nebo jiné nastavení účtu,
  • změnit heslo, pokud aplikace takovou změnu umožňuje bez dalšího ověření,
  • odeslat formulář jménem oběti,
  • provést nákup nebo jinou finanční operaci,
  • změnit oprávnění nebo nastavení účtu.

CSRF je zvlášť problematické u požadavků, které mění stav aplikace.

Jak CSRF správně řešit?

1. Používat CSRF token

Nejběžnější ochrana je náhodný CSRF token, který server vloží do formuláře a následně ho kontroluje při zpracování požadavku.

<form action="/change-email" method="POST"> <input type="hidden" name="csrf_token" value="RANDOM_TOKEN"> <input type="email" name="email"> <button type="submit">Změnit e-mail</button> </form>

Server musí ověřit, že csrf_token odpovídá tokenu uloženému pro danou relaci. Token musí být dostatečně náhodný a nepředvídatelný.

2. Nastavit SameSite u cookies

Autentizační cookies by měly mít vhodně nastavený atribut SameSite, například:

Set-Cookie: session=abc123; Secure; HttpOnly; SameSite=Lax

SameSite=Lax nebo podle konkrétní aplikace SameSite=Strict může výrazně omezit možnosti CSRF útoku.

3. Kontrolovat Origin nebo Referer

Server může u citlivých požadavků kontrolovat hlavičku Origin a případně Referer, aby ověřil, že požadavek skutečně pochází z očekávaného webu.

4. Neměnit stav pomocí GET

Operace, které mění data, by neměly používat GET.

Špatně:

GET /delete-account

Lépe:

POST /delete-account

Samotné použití POST ale není dostatečná ochrana proti CSRF. I POST požadavek může být vytvořen z cizí stránky. Proto je vhodné použít CSRF token a další vhodné ochrany.

Nejdůležitější pravidlo

Pro stav měnící požadavky používej CSRF token, správně nastavené cookies (zejména SameSite) a podle potřeby kontrolu Origin.

Pokud používáš moderní framework jako Django, Laravel, Symfony, Spring, ASP.NET nebo Rails, obvykle má ochranu proti CSRF přímo zabudovanou. V takovém případě je nejlepší použít mechanismus poskytovaný frameworkem a nevymýšlet vlastní implementaci.

Ať už dbáte na bezpečnost vaší aplikace nebo ne, rozhodně je potřeba zároveň zálohovat data, protože data je to nejcennější co máte!