Přeskočit na hlavní obsah
13. říjnaOnline webinářKariéra v IT: Jak se dostat na manažerskou a C-level poziciRezervujte si místo zdarma

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​

  1. 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)
  1. 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
  • Ú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​

  1. 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
  2. Použijte validaci na všechna vstupní data
  3. Definujte povolenou množinu znaků
  4. 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() );
  }
}

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
  1. 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 &lt;script&gt;
  • 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ů​

Ověření nahrávání​

  1. Zajistěte, aby název nahraného souboru používal očekávanou příponu
  2. Ujistěte se, že nahraný soubor není větší než maximální definovaná velikost souboru
  3. Proveďte kontrolu platnosti před rozbalením souboru v případě ZIP souborů
    1. Zkontrolujte célovou cestu, úroveň komprese a odhadovanou velikost rozbaleného souboru

Úložiště nahraných souborů​

  1. Použijte nový název souboru pro uložení v OS
  2. Nepoužívejte uživatelem zadaný název
    • Např. test.jpg přejmenujte na JAI1287uaisdjhf.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
  3. 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​

  1. 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
  1. 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
    1. Zakažte spusttitelné soubory a skripty - aspx, asp, css, swf, xhtml, rhtml, shtml, jsp, js, pl, php, cgi

Validace uploadu obrázků​

  1. Ověřte, zda je obrázek platný a odstraňte z něj cizí obsah pomocí knihoven pro přepisování obrázků
  2. Nastavte příponu obrázku na základě zjištěného typu obsahu (nevěřte pouze hlavičce z nahrávání)
  3. 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
    • [email protected]
    • 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é
  1. 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ů

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é
  1. 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
  2. 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í
  • 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

Kam dál​

Checklisty​