Představte si, že někdo návštěvníka přiměje kliknout na odkaz ve chvíli, kdy je přihlášený do internetového bankovnictví. Odkaz vede na skrytý formulář, který bez vědomí návštěvníka odešle bance požadavek na převod peněz. Banka vidí legitimní požadavek od ověřeného uživatele a provede ho. Útočník tak poslal peníze z účtu oběti, aniž by znal její heslo.
Takto vypadá CSRF (Cross-Site Request Forgery): útok, při kterém útočník přiměje oběť, aby nevědomky odeslala formulář nebo požadavek na jiný web, kde je už přihlášená.
Co se dozvíte: Co jsou útoky CSRF a jak fungují, proč jsou tak nebezpečné i při jiných bezpečnostních opatřeních, jak jim zabraňují tokeny CSRF a jak ochranu zavést do svých formulářů.
Co je CSRF?
CSRF (čti „sí-serf“) je zkratka pro Cross-Site Request Forgery. Je to útok, který využívá toho, že když jste přihlášení na webu, váš prohlížeč automaticky důvěřuje vaší relaci a přikládá ji ke každému požadavku, který tomuto webu pošlete, i když požadavek pochází z jiného webu.
Útok funguje tak, že přihlášeného návštěvníka přimějí, aby nevědomky odeslal formulář na web, kde má účet. Útočník heslo oběti nevidí. Nepotřebuje ho. Stačí mu, aby byla oběť už přihlášená, a pak ji přiměje odeslat požadavek (například skrytý formulář), který udělá to, co útočník chce.
CSRF se liší od jiných útoků tím, že nevyžaduje krádež přihlašovacích údajů ani prolomení šifrování. Využívá důvěru oběti ve web. Oběť je už ověřená, proto web důvěřuje požadavkům, které zdánlivě pocházejí od ní.
Jak útoky CSRF fungují
Útok CSRF probíhá ve třech krocích.
Krok 1: Oběť je přihlášená na vašem webu
Někdo navštíví váš web a přihlásí se do svého účtu. Jeho prohlížeč má nyní aktivní cookie relace, která dokazuje, že je ověřený. Relace zůstává aktivní, dokud web dál používá.
Krok 2: Útočník oběť nalákal na škodlivou stránku
Oběť je stále přihlášená na vašem webu a navštíví stránku, kterou útočník ovládá (třeba přes odkaz ze sociální sítě, klamavou reklamu nebo web, který vypadá důvěryhodně). Na této stránce je skrytý kód, který odešle formulář zpět na váš web.
Krok 3: Formulář se odešle automaticky pomocí relace oběti
Skrytý formulář se odešle na váš web. Protože je oběť už přihlášená, její prohlížeč k požadavku automaticky připojí cookie relace. Z pohledu vašeho formuláře jde o legitimní požadavek od ověřeného uživatele. Formulář ho zpracuje, jako by ho oběť odeslala záměrně.
Útočník tak na vašem webu něco provedl pomocí účtu oběti, aniž by o tom oběť věděla. Mohl změnit heslo, převést peníze, upravit profil nebo odeslat data.
Proč to funguje i při jiných bezpečnostních opatřeních
Útoky CSRF obcházejí několik běžných bezpečnostních prvků:
HTTPS CSRF nezastaví. Data jsou při přenosu šifrovaná, ale útočník je nemusí zachytávat. Pošle požadavek z prohlížeče oběti, kterému prohlížeč oběti už důvěřuje.
Ochrana heslem CSRF nezastaví. Útočník heslo oběti nikdy nepotřebuje. Jen využije toho, že oběť je už přihlášená.
Silné přihlašování CSRF nezastaví. I když je ověřování dokonalé, pokud je oběť přihlášená, útok funguje.
Proto je ochrana proti CSRF samostatná vrstva. Jiná bezpečnostní opatření jí nezabrání. Formuláře je třeba navrhnout tak, aby útokům CSRF odolaly.
Tokeny CSRF: jak útok zastaví
Řešením je token CSRF. Je to jedinečný, nepředvídatelný řetězec, který váš server vygeneruje pro každý formulář. Funguje takto:
Váš server vytvoří pro každého návštěvníka jedinečný token
Když někdo načte stránku s formulářem, server vygeneruje náhodný token a přiřadí ho k relaci tohoto uživatele. Token je pokaždé jiný a je jedinečný pro daného uživatele.
Token je vložen do formuláře
Token je do HTML formuláře vložen jako skryté pole. Když návštěvník formulář odešle, token putuje s ním.
Server před zpracováním odeslání token ověří
Po odeslání formuláře server zkontroluje, zda token v odeslání odpovídá tokenu, který jste pro relaci tohoto uživatele vygenerovali. Pokud ano, formulář se zpracuje. Pokud ne (nebo pokud token chybí), formulář se odmítne.
Skrytý formulář útočníka nemůže obsahovat platný token, protože tokeny jsou nepředvídatelné a jedinečné pro každou relaci. Útočník na jiné doméně token nevidí a nemůže ho uhodnout. Útok tedy selže. Skrytý formulář se odešle, ale váš server ho odmítne, protože token nesouhlasí.
Jak token CSRF vypadá v praxi
V HTML vypadá formulář chráněný proti CSRF takto:
<form method="POST" action="/submit-form"> <input type="hidden" name="csrf_token" value="a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6"> <input type="email" name="email" placeholder="Your email"> <button type="submit">Submit</button> </form> Pole `csrf_token` je skryté. Návštěvník ho nevidí, ale odešle se spolu s ostatními údaji formuláře. Váš server ho zkontroluje dřív, než zpracuje e-mail nebo jiná data.
Ochrana proti CSRF pro různé typy formulářů
Klasické HTML formuláře
Standardní HTML formuláře (ty, které posílají data metodou POST na váš server) potřebují tokeny CSRF. Patří sem kontaktní formuláře, přihlašovací formuláře, formuláře pro obnovu hesla a každý formulář, který na serveru mění data.
Formuláře AJAX a JavaScript
Formuláře odesílané pomocí JavaScriptu na koncový bod API také potřebují ochranu proti CSRF. Token může být vložen přímo do formuláře, uložen v cookie nebo načten z meta značky před odesláním požadavku.
Bezstavové požadavky na API
Pokud vaše API používá ověřování pomocí tokenů (například JWT), ochrana proti CSRF funguje jinak. Prohlížeč nemůže token JWT připojit automaticky tak, jako připojuje cookie relace, proto je klasický CSRF menší hrozbou. Přesto je osvědčeným postupem přidat navíc token CSRF pro další ochranu.
Další ochrany, které fungují spolu s tokeny CSRF
Tokeny CSRF jsou hlavní obrana, ale nejlépe fungují společně s dalšími bezpečnostními postupy.
Cookies SameSite
Při nastavování cookie relace můžete přidat atribut `SameSite`, který prohlížeči říká, aby cookie nepřikládal k požadavkům z jiné domény. Skrytý formulář útočníka pak relaci oběti nemůže využít vůbec.
Kontrola hlavičky Referer
Váš server může zkontrolovat hlavičku Referer a zjistit, odkud požadavek přišel. Pokud odeslání formuláře tvrdí, že pochází z vaší domény, ale Referer ukazuje jinou doménu, jde pravděpodobně o útok. (Hlavičky Referer lze ale podvrhnout, takže to není úplná obrana.)
Vzor double-submit cookie
V tomto přístupu je token CSRF uložen v cookie i v poli formuláře. Server před zpracováním ověří, že se shodují. Je to méně obvyklé než klasické tokeny, ale pro bezstavové aplikace to funguje dobře.
Jak ochranu proti CSRF zavést
Podrobnosti závisejí na vašich technologiích, ale postup je stejný:
- Vygenerujte jedinečný token pro každou relaci. Když uživatel zahájí relaci nebo načte stránku s formulářem, váš backend vygeneruje nový token.
- Uložte token na serveru. Uložte ho přiřazený k relaci daného uživatele.
- Vložte token do formuláře. Přidejte ho jako skryté pole v HTML nebo jako meta značku, kterou umí přečíst JavaScript.
- Při odeslání ověřte. Před zpracováním jakýchkoli dat formuláře zkontrolujte, že odeslaný token odpovídá tokenu uloženému pro danou relaci.
- Po citlivých akcích token obnovte. Poté, co uživatel změní heslo nebo udělá něco zásadního, vygenerujte nový token.
Většina moderních frameworků (Django, Rails, Laravel, ASP.NET) generuje a ověřuje tokeny CSRF automaticky. Pokud framework používáte, ochrana proti CSRF bývá ve výchozím nastavení zapnutá. Jen si dejte pozor, abyste ji omylem nevypnuli.
Časté chyby, kvůli kterým jsou formuláře zranitelné
Vypnutí ochrany proti CSRF pro pohodlí. Někteří vývojáři kontroly CSRF vypínají, aby si usnadnili testování API nebo zjednodušili kód. Nedělejte to. Vzniká tím skutečná zranitelnost.
Statický token pro všechny uživatele. Token musí být jedinečný pro relaci každého uživatele. Token, který je stejný pro všechny (nebo stejný pro všechny uživatele ve všechny dny), před CSRF nechrání.
Neobnovování tokenů. Pokud používáte stejný token týdny, má útočník víc času ho zneužít. Tokeny obnovujte pravidelně a vždy po citlivých operacích.
Spoléhání jen na cookies SameSite. SameSite pomáhá, ale nestačí. Jako hlavní obranu používejte tokeny CSRF a SameSite jako zálohu.
Zapomenuté tokeny u některých formulářů. Když některé formuláře tokeny chrání a jiné ne, útočníci využijí ty nechráněné. Ochranu potřebuje každý formulář, který mění data.
Co WEMASY dělá pro ochranu proti CSRF
Formuláře WEMASY automaticky obsahují ochranu tokenem CSRF u každého formuláře, který vytvoříte. Nemusíte ji nastavovat ani na ni myslet. Když návštěvník formulář odešle, WEMASY před uložením odeslání token ověří. Tato ochrana je zabudovaná a ve výchozím nastavení zapnutá.
Více o možnostech zabezpečení formulářů najdete na ceníku.