Bezpečnost webových aplikací

  • 19.11.2008
  • Tomáš Hojgr

Bezpečnost webových aplikací je mnohdy podceňovaná, přitom tyto aplikace mohou sdílet velmi důvěrná data o lidech, kteří aplikace používají. Ať již se jedná jen o jména a emaily našich zákazníků, tyto informace v jistých rukách mohou představovat velmi vysoké riziko zneužití. Je nutné si uvědomit, že bez dostatečného zabezpečení těchto dat se vystavujeme riziku nejen zneužití osobních informací našich zákazníků třetími osobami, ale také znevážení našich projektů a možná i soudních žalob ze stran zákazníků o vydání důvěrných dat třetím osobám.

Množství útoků na webové servery neustále roste, přičemž se mění i taktika útočníků. Na těchto internetových stránkách představím nejznámější typy útoků a možností jejich obrany (pokud je u daného typu útoku vůbec nějaká možnost obrany).

Cross site scripting

Hojně používaná metoda útočníků, kdy pomocí JavaScriptu dokáží ovládnout celý systém webové aplikace. Tato metoda těží z nedbalosti programátorů, kteří nedokonale zabezpečili vstupy a výstupy uživatele a dovolili mu vytvořit kód JavaScriptu a ten navíc ještě na svých stránkách spustit. Útočník tak může ovládat aplikaci a vytvářet podvržené stránky nic netušícím uživatelům. Co je však ještě horší, je možné tímto způsobem zjistit SESSION ID (jedinečný identifikátor uživatele) a následně se vydávat za právoplatného uživatele. Důsledky mohou být katastrofální jak pro uživatele webové aplikace, tak i pro administrátora aplikace, jelikož není moc velký problém tímto způsobem vstoupit do administrace aplikace a provádět různé operace za administrátora.

Možnosti obrany

Je nutné si uvědomit, že veškeré vstupy uživatele mohou být potencionálně nebezpečné. Ať již se jedná o vstupy na základě formulářů zaslané metodami POST a GET, tak i vstupy, u kterých přímo není jasný původ, mezi něž zahrnujeme COOKIES, či hlavičky jednotlivých požadavků (HEAD). Vývojář proto musí veškeré vstupy uživatele kontrolovat a filtrovat na základě toho, co chce od uživatele získat. Pokud od uživatele žádáme jméno a heslo pro přihlášení, určitě mu nedovolíme, aby do políček zadal nějaký JavaScriptový kód. Pokud zadá, musí aplikace tento kód odstranit a nedovolit jeho spuštění a to například tím, že od zadaných hodnot odstraníme veškeré HTML značky (tím odstraníme i HTML značky pro uvozování JavaScriptových kódu <SCRIPT></SCRIPT> a tím znemožníme spuštění kódu) a necháme jen čistý text.

Někdy je vhodné dovolit uživateli, aby mohl zadávat i HTML značky pro například formátování textu při vkládání článků. V takovém případě musí vývojář filtrovat takové značky HTML,  které mohou být potenciálně nebezpečné. Problém je, že kromě značek <SCRIPT></SCRIPT> mohou být nebezpečné i značky, které se na první pohled jeví, jako bezpečné, např. značka <IMG>. Tato nepárová značka umožňuje vkládat obrázky do HTML stránky, avšak jako každá značka může obsahovat i vytvoření obsluhy událostí a tu navázat na JavaScriptový kód. Např. <img onload="alert('ahoj')"/> vytvoří obrázek, avšak ihned po načtení obrázku se spustí nebezpečný kód JavaScriptu (v tomto případě jen zobrazí hlášku "ahoj").

Pro zamezení těchto neoprávněných škodlivých skriptů je nutné vytvořit filtrovací funkci, která bude procházet veškerý text od uživatele tak, jako to například dělá internetový prohlížeč, a odstraňovat nebezpečné značky, či vlastnosti značek. Problém je, že pokud uživatel zadá např. <scr<script>ipt>, tak po odstranění <skript> vznikne <skript> znovu a útočník může útočit dál. Proto je důležité procházet filtr několikrát, dokud není text od značek plně odfiltrován.

Závěrem

Není přímo jednoduché se bránit cross site scriptingu. Ovšem vývojář musí udělat vše proto, aby se útočník nemohl dostat k citlivým údajům uložených na serveru. Je proto nutné řádně kontrolovat a filtrovat veškeré požadavky přicházející od uživatele a předkládat mu stránky bezpečné stránky bez cizího skriptu.