Validace vstupu
- Validace vstupních dat se provádí proto, aby se zajistilo, že do systému vstupují pouze správná data
- To zabrání uložení nesprávných dat a následných aplikačních chyb v navazujících komponentách
- K validaci by mělo dojít co nejdříve, nejlépe hned po přijetí dat
- Data ze všech nedůvěryhodných zdrojů by měla podléhat validaci
- Nejen uživatelská data, ale také data z jiných systémů, třetích stran, dodavatelů atd.
- Každý z nich totiž může být kompromitován a odesílat chybná data
- Validace vstupů by neměla být používána jako primární metoda prevence XSS, SQL injection a dalších
- Při správné implementaci však může významně přispět ke snížení jejich dopadu
Strategie
- Provádějte validaci jak na syntaktické, tak na sémantické úrovni
- Syntaktická = zajišťuje správnou syntaxi dat (datum, SSN, symbol měny)
- Sémantická = zajišťuje správnost hodnot v daném kontextu (datum zahájení, datum ukončení, cena v očekávaném rozsahu)
- Předcházejte útokům co nejdříve při zpracování požadavku uživatele
- K odhalení neoprávněného vstupu lze použít právě validaci
Implementace
- Validace lze realizovat pomocí libovolné programovací techniky, která umožňuje vynucení syntaktické a sémantické správnosti
- Validátory datových typů, které jsou nativně k dispozici ve webových frameworcích (Django validators, Apache Commons Validators, atd.)
- Validace podle JSON nebo XML (XSD) schématu
- Konverze typů (
Integer.parseInt()
,int()
) s přísným zpracováním výjimek - Kontrola minimálního a maximálního rozsahu hodnot pro číselné parametry a kontrola délky řetězce
- Pole povolených hodnot pro malé sady string parametrů (dny v týdnu)
- Regulární výrazy pro jakákoli jiná strukturovaná data pokrývající celý řetězec (
^...$
) a nepoužívající “libovolný” znak (\S
)
Seznam povolených a nepovolených vstupů
- Častou chybou je použití validace na základě seznamu nepovolených vstupů ve snaze odhalit nebezpečné znaky a vzory (
'
,1=1
,<script>
) - Takové filtry je možné triviálně obejít
- Zároveň tyto filtry brání autorizovanému přístupu, jako je například
O'Brian
, kde je znak'
legitimní - Seznam povolených vstupů je však vhodný pro všechna vstupní data
- Validace na základě tohoto seznamu zahrnuje definici toho, co je autorizováno s tím, že všechno ostatní autorizováno není
- Pokud jde o dobře strukturovaná data (rodná čísla, PSČ, emaily), mělo by být snadné definovat silný validační vzor založený na regulárních výrazech
- Pokud vstupní hodnota pochází ze sady možností (selectbox, radiobutton), pak musí přesně odpovídat jedné z definovaných hodnot selectboxu nebo radiobuttonu
Validace textu ve volném tvaru
- Text ve volném tvaru (zejména Unicode) je obtížně validovatelný kvůli velkému množství znaků, které je potřeba povolit
- Zdůrazňuje důležitost kódování v závislosti na kontextu a ukazuje, že validace není hlavní ochranou proti XSS
- Pokud uživatelé chtějí do pole pro komentář napsat znaky jako
<
nebo'
, mohou pro to mít legitimní důvod
- Pokud uživatelé chtějí do pole pro komentář napsat znaky jako
- Úkolem aplikace je s textem správně zacházet po celou dobu životního cyklu dat
- Hlavními zásadami jsou
- Normalizace - zajistěte, aby bylo v celém textu použito kanonické kódování a aby se v něm nevyskytovaly žádné neplatné znaky
- Seznam povolených kategorií znaků - Unicode umožňuje zařazení do kategorií, jako jsou čísla, písmena atp.
- Individuální seznam znaků - na základě kontextu můžete povolit ideogramy, apostrofy, pokud nechcete povolovat celou kategorii interpunkčních znamének
Regulární výrazy
- Regulární výrazy mohou být komplikované a přesahují rámec tohoto dokumentu
- Více informací najdete v OWASP validation regex repository
- Při návrhu si dejte pozor na útoky typu ReDoS
- Způsobují, že program používající špatně navržený regulární výraz pracuje velmi pomalu a dlouho využívá CPU prostředky
- Použijte validaci na všechna vstupní data
- Definujte povolenou množinu znaků
- Definujte minimální a maximální délku dat (
{1,25}
)
Regulární výrazy - seznam povolených znaků
- Validace US PSČ:
^\d{5}(-\d{4})?$
- Validace US států ze seznamu (selectbox)
^(AA|AE|AP|AL|AK|AS|AZ|AR|CA|CO|CT|DE|DC|FM|FL|GA|GU|
HI|ID|IL|IN|IA|KS|KY|LA|ME|MH|MD|MA|MI|MN|MS|MO|MT|NE|
NV|NH|NJ|NM|NY|NC|ND|MP|OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|
TX|UT|VT|VI|VA|WA|WV|WI|WY)$
- Použití v Javě
private static final Pattern zipPattern = Pattern.compile("^\d{5}(-\d{4})?$");
public void doPost( HttpServletRequest request, HttpServletResponse response) {
try {
String zipCode = request.getParameter( "zip" );
if ( !zipPattern.matcher( zipCode ).matches() {
throw new YourValidationException( "Improper zipcode format." );
}
// Do what you want here, after its been validated ..
} catch(YourValidationException e ) {
response.sendError( response.SC_BAD_REQUEST, e.getMessage() );
}
}
- Některé validátory jsou předdefinovány v různých open source balíčcích - např. Apache Commons Validators
Client side vs server side validace
- Útočník, který zakáže javascript nebo použije proxy, může obejít jakoukoli validaci prováděnou na klientovi
- Ujistěte se, že validace prováděná na klientovi je také na serveru
Validace rich user contentu
- Rich content je velmi obtížné validovat
- Více informací najdete v XSS cheat sheetu
Prevence XSS a zásady zabezpečení obsahu
- Všechna uživatelská data musí být při vrácení na HTML stránku zakódována
- Tím se zabrání spuštění škodlivých dat (XSS)
- Např.
<script>
by byl vrácen jako<script>
- Např.
- Typ kódování je specifický pro kontext stránky
- Kódování dat, které se vkládají do HTML se bude lišit od kódování při vkládání do javascriptu atd.
- Více informací najdete v XSS cheat sheetu
Validace uploadu souborů
- Více informací najdete v cheat sheetu o uploadu souborů
Ověření nahrávání
- Zajistěte, aby název nahraného souboru používal očekávanou příponu
- Ujistěte se, že nahraný soubor není větší než maximální definovaná velikost souboru
- Proveďte kontrolu platnosti před rozbalením souboru v případě ZIP souborů
- Zkontrolujte célovou cestu, úroveň komprese a odhadovanou velikost rozbaleného souboru
Úložiště nahraných souborů
- Použijte nový název souboru pro uložení v OS
- Nepoužívejte uživatelem zadaný název
- Např.
test.jpg
přejmenujte naJAI1287uaisdjhf.jpg
(náhodný název souboru) - Účelem je zabránění rizika přímého přístupu k souboru a nejednoznačnému názvu souboru
- Např.
- Analyzujte soubory na škodlivý obsah (antimalware, statická analýza)
- Cestu k souboru by nemělo být možné zadat na straně klienta - rozhoduje o ní server
Veřejné podávání nahraného obsahu
- Zajistěte, aby nahrané obrázky byly zobrazovány se správným content type (
image/jpeg
,application/x-xpinstall
)
Dávejte pozor na “speciální” soubory
- Funkce nahrávání by měla být založena na seznamu povolených souborů, který povoluje pouze určité typy a přípony
- Mějte napaměti, že následující typy souborů mohou vést k bezpečnostním zranitelnostem
crossdomain.xml
/clientaccesspolicy.xml
- Umožňuje načítání dat napříč doménami ve Flash, Java a Silverlight aplikacích
- To může umožnit krádež dat napříč doménami a CSRF
- Takové soubory je nejlepší zakázat
.htaccess
a.htpasswd
- Poskytuje možnost konfigurace serveru pro jednotlivé adresáře
- Neměl by být povolen
- Viz dokumentace HTACCESS
- Zakažte spusttitelné soubory a skripty -
aspx, asp, css, swf, xhtml, rhtml, shtml, jsp, js, pl, php, cgi
Validace uploadu obrázků
- Ověřte, zda je obrázek platný a odstraňte z něj cizí obsah pomocí knihoven pro přepisování obrázků
- Nastavte příponu obrázku na základě zjištěného typu obsahu (nevěřte pouze hlavičce z nahrávání)
- Zkontrolujte, zda je zjištěný typ obrázku v seznamu definovaných typů (jpg, png, atd.)
Validace emailu
Syntaktická validace
- Formát emailových adres je definován v RFC 5321 a je mnohem složitější, než si většina lidí uvědomuje
- Za platné adresy se považují například tyto
"><script>alert(1);</script>"@example.org
user+subaddress@example.org
user@[IPv6:2001:db8::1]
" "@example.org
- Správné analyzování pomocí regulárních výrazů je složité
- Ačkoli RFC definuje velmi flexibilní formát, většina implementací (mail serverů) používá mnohem omezenější formát adres
- Čímž odmítají adresy, které jsou technicky platné
- Proveďte základní ověření a poté adresu předejte mail serveru a čekejte, zda ji odmítne nebo ne
- Emailová adresa obsahuje dvě části oddělené
@
- Neobsahuje nebezpečné znaky (zpětná lomítka, jednoduché a dvojité uvozovky, null bytes)
- Přesné určení znaků závisí na tom, jak bude adresa použita (zobrazení na stránce, uložení do databáze)
- Doménová část obsahuje pouze písmena, číslice, pomlčky a tečky
- Má přiměřenou délku
- Před znakem
@
by nemělo být více než 63 znaků - Celková délka by neměla přesáhnout 254 znaků
- Před znakem
- Emailová adresa obsahuje dvě části oddělené
Sémantická validace
- Spočívá v určení, zda je emailová adresa legitimní
- Nejlepším způsobem je zaslat uživateli email a požadovat, aby kliknul na odkaz v emailu nebo zadal nějaký kód
- Ověření správnosti adresy
- Aplikace na něj může odesílat emaily
- Uživatel má přístup ke schránce
- Zasílané odkazy by měly obsahovat token, který je
- alespoň 32 znaků dlouhý
- generován pomocí bezpečného zdroje náhodnosti
- na jedno použití
- časově omezený (např. expiruje po 2 hodinách)
Jednorázové emailové adresy
- V některých případech uživatelé nechtějí uvádět svou pravou adresu a uvedou jednorázovou
- Jedná se o veřejně dostupné adresy, které nevyžadují ověření uživatele
- Používají se ke snížení nevyžádané pošty
- Zablokování těchto adres je téměř nemožné, protože existuje velké množství stránek nabízejících tyto služby
- Existuje velké množství seznamů těchto stránek, ale ty budou vždy neúplné
- Zobrazte uživateli zprávu s vysvětlením, proč jsou tyto adresy blokovány, pokud tyto seznamy používáte
- I když si pravděpodobně vyhledá jiného poskytovatele
- Povolte registrace pouze některých emailových poskytovatelů, pokud je nezbytné blokování jednorázových adres
- Např. Google, Yahoo
- Uživatelé si ale u nich stejně jednoduše vytvoří nový (jednorázový) účet
Sub-addressing
- Umožňuje uživateli zadat tag v části adresy před
@
, kterou bude mailserver ignorovat - Pokud například doména
example.org
podporuje sub-addressing (podadresování), pak jsou následující adresy ekvivalentníuser@example.org
user+site1@example.org
user+site2@example.org
- Mnoho poskytovatelů (např. Microsoft Exchange) takové adresování nepodporuje
- Nejvýznamnějším poskytovatelem, který sub-addressing poskytuje je Gmail
- Uživatelé používají pro každou stránku jiný tag, aby v případě, že začnou dostávat nevyžádanou poštu na některou z těchto adres, mohli určit, ze které stránky email unikl nebo kdo jejich adresu prodal
- Některé weby mohou chtít blokovat sub adresy, protože by uživatel mohl zaregistrovat více účtů na “stejnou” adresu
- To se obecně nedoporučuje, protože to naznačuje, že
- majitel webu o sub-addressungu neví
- chce zabránit identifikaci uživatelů při úniku dat nebo jejich prodeji
- Navíc to lze jednoduše obejít registrací s jednorázovou adresou