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čí.
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.
Záleží na tom, jaké operace aplikace umožňuje. Útočník může například:
CSRF je zvlášť problematické u požadavků, které mění stav aplikace.
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ý.
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.
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.
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.
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!
Copyright © 2016 Minimax Digital Firm - Design: Tooplate
Bc. Josef Jebavý - blog www.josefjebavy.cz - IT konzultace, správa serverů a vývoj SW/HW projektů na míru