České weby jsou uživatelsky příjemná bezpečnostní katastrofa

15. 10. 2012
Doba čtení: 8 minut

Sdílet

Napsat dobře web není žádná legrace. Je třeba k tomu mnoho umět, dát si pozor na mnohá úskalí a překonat řadu překážek a chyb. Naučili se už konečně čeští programátoři dělat web pořádně? Na to odpoví jeden z porotců soutěže WebTop100, kterému rukama prošly dvě stovky webů. Radost vám udělá jen napůl.

Michal Špaček je jedním z letošních porotců WebTop100 a byl jím i loni. Chcete vědět, co napsal o stavu loňských webů? Přečtěte si následující článek. Chcete vědět, co řekne o těch letošních? Přijďte na letošní konferenci WebTop100 25. října.

Mám-li shrnout weby přihlášené do soutěže WebTop100 v roce 2011 z pohledu technického řešení, pak nemohu jinak než poskytnout dva zcela odlišné názory, podle toho, z jakého úhlu se na hodnocené weby podíváme.

Pokud weby používáme zcela standardním a autory zamýšleným způsobem, tedy klikáním na odkazy a zadáváním zcela přirozených slov do vyhledávacích políček na stránkách tak, jak to dělá naprostá většina návštěvníků, pak by mé hodnocení vyjádřené jedním slovem znělo asi takto: velmi dobré.

Zkusíme-li si zahrát hru, která vzdáleně připomíná hru na bezpečnostní experty, přidáme-li nějaký divný znak do adresy stránky nebo pokud napíšeme do vyhledávacího políčka místo názvu produktu znaky, které se běžně nepoužívají ani na dálném východě, tak brzy zjistíme, že přihlášené weby nelze hodnotit jinak než slovem katastrofa. Ale nepředbíhejme.

Češi se už (většinou) naučili weby dělat

Pojďme si web projít pěkně od začátku. První, co každý návštěvník vidí, je adresa webu, tedy například www.webtop100.cz. Někteří návštěvníci, především profesionálové z oboru, jsou zvyklí zadávat adresu bez počátečního www, ať už z lenosti, nebo proto, že zastávají názor, že je to přežitek. Web by se tedy měl správně načíst při zadání obou variant (www.webtop100.czwebtop100.cz), toto pravidlo splňovala naprostá většina hodnocených webů, výjimky by se daly spočítat na prstech jedné ruky. Většina z té většiny webů měla pak zvolenu jednu preferovanou variantu a tu druhou korektně přesměrovala. Nejenže to působí profesionálně, ale pomáhá to především internetovým vyhledávačům jako jsou např. Google či Seznam se na webu zorientovat a nepovažovat tyto dvě různé varianty jedné adresy za dva různé weby.

Kromě domény návštěvník vidí při procházení webu i zbytek adresy, včetně cesty, která se uvádí za doménou, tedy například www.webtop100.cz/soutez/porota. Převážná většina webů měla tyto adresy „čisté“ a pěkně čitelné, narazit na web s adresami typu index.php?menu=123&page=456 je přibližně stejně pravděpodobné, jako vidět dvojitou duhu. Tu jsem bohužel při hodnocení neviděl, hodnotil jsem totiž převážně v noci, ale na pár webů s takovýmito nepěknými adresami jsem narazil. Spousta webů je také na dobré cestě, a tak jim k dokonalosti adres chybí již jen drobnosti, jako například odstranit z adres různé nadbytečné index.html  a podobně.

Někdy se může stát, že se návštěvník dostane na stránku, která neexistuje. Ačkoliv toto spojení zní, jako kdyby jej vymyslel Erwin Schrödinger, je to jev poměrně běžný, bohužel. Starší články odkazují na ještě starší weby, záložky v prohlížečích nejsou aktualizovány nebo zkrátka provozovatel neví, jakou strukturu a obsah jeho web vlastně má. Takovou neexistující stránku poznáte snadno, většinou je na ní napsáno něco jako „Page Not Found“ nebo „404“. Bohužel často je to to jediné, co je na takové stránce napsáno. Návštěvník poté neví, co se vlastně stalo, proč v prohlížeči nevidí to, co hledal a neví, co má dělat dál.

Většina webů v soutěži naštěstí na takové stránce, která neexistuje, uvádí důvod, proč neexistuje a nabízí pár rad, jak se návštěvník má zachovat, pokud zrovna na takovou neexistující stránku narazil. Je ovšem nutné podotknout, že by poskytované informace a rady mohly být bohatší. Nejhorší případ je ten, kdy je návštěvník bez milosti přesměrován na titulní stránku webu, v tu chvíli kouká jak ono pověstné péro z gauče a netuší, co se právě stalo, na tuto variantu jsem při hodnocení naštěstí nenarazil. Na internetu lze najít pár návodů, jak takovou dobrou Not Found stránku vyrobit, přečtěte si je, stojí to za to! Důležité je také posílat správný HTTP stavový kód (to je právě ten kód 404, který tolik stránek tak hrdě uvádí), to především pro vyhledávače, které potom danou stránku nenabízí ve svých výsledcích.

Pokud návštěvník narazí na takovou neexistující stránku, případně jenom nemůže najít požadovanou informaci, může využít interní vyhledávač na stránkách. Vytvořit takový vyhledávač není jednoduché, musí nabízet relevantní výsledky, být rychlý a jednoduchý na používání. Kvalita vyhledávačů na přihlášených webech se velice různila. Některé stránky implementují vyhledávání od Google, což návštěvníkům poskytuje nejenom známé prostředí, ale také kvalitní výsledky, bohužel takových stránek je opravdu jenom pár. Většina stránek pak implementuje více či méně úspěšně vyhledávání vlastní. Některé vlastní vyhledávače však vracejí naprosté hlouposti, například odkazy na prázdné či neexistující stránky. V takovém případě je asi lepší vyhledávací políčko na stránky vůbec nedávat.

Když se tedy konečně návštěvník dostane na nějakou existující stránku, uvidí ve svém prohlížeči titulek dané stránky. Každá stránka na webu by měla mít svůj jedinečný titulek. To se hodí především ve chvíli, kdy máte v prohlížeči otevřeno několik stránek z jednoho webu, podstatně to usnadní orientaci v takových stránkách. Tvůrci webů se to již naštěstí naučili (pravděpodobně proto, že sami mívají naráz otevřeno několik stránek z jednoho webu), a tak až na pár (doslova) výjimek měla každá stránka na webu opravdu svůj vlastní titulek.

Weboví kodéři se také naučili, že tabulky slouží na zobrazování tabulkových dat a ne na rozmístění prvků na stránku. Pár webů, které zneužívají tabulky na rozmístění, se během hodnocení našlo, ale vždy mě uklidnilo, že ty weby nejspíš nebyly vyrobeny v tomto tisíciletí. Našel jsem ale několik případů, kdy na jinak moderních webech byly použity tabulky například k umístění vstupního políčka a tlačítka vedle sebe, toto by se na webech vyrobených během posledních pár let nemělo objevovat.

Prvky stránky by se na moderním webu měly formátovat a pozicovat pomocí kaskádových stylů (CSS) a tyto styly by měly být zapsány v externích souborech. Bohužel toto poslední pravidlo bylo často porušováno a kaskádové styly byly přímo zapsány v atributech daných prvků. V zásadě to ničemu nevadí, jenom zbytečně narůstá velikost přenášených dat nutných k načtení stránky.

Při hodnocení jsem pak bral v úvahu i takové detaily, jako je například přítomnost souboru robots.txt. Ten obsahuje sadu příkazů pro internetové vyhledávače, tzv. roboty. Především jim zakazuje procházet některé stránky. Obsah takových zakázaných stránek se pak nezobrazí ve výsledcích vyhledávání. Je dobré na webu takovýto soubor mít, i kdyby byl prázdný. Ve statistikách návštěvnosti pak nebudeme mít Not Found chyby, protože tento soubor bylo možné na našem webu najít, a roboti nám budou vděční.

Bezpečnost je stále katastrofa

Tímto končí ta lepší část mého souhrnu, následovat bude část věnovaná bezpečnosti, a pokud ještě nesedíte, tak se prosím posaďte a připoutejte se. Do soutěže bylo přihlášeno něco málo přes dvě stě webů a převážná většina z nich měla nějaký bezpečnostní problém, na který jsem přišel během maximálně pár desítek minut.

To je velice znepokojivý stav, a to myslím zcela vážně. Pokud se tvůrci webů nenaučí několika základním bezpečnostním návykům, jednoho dne se může stát, že celý český web a jeho uživatele rozbolí hlava tak, jak mě rozbolela vždy, když jsem nějaký problém našel. A že to bylo často. V takovém případě byl web diskvalifikován, získal automaticky nulové hodnocení. K čemu jsou hezké adresy, beztabulkové layouty a vyhledávače jednorožců, když kdokoliv může získat přihlašovací údaje uživatelů.

Nutno poznamenat, že většina bezpečnostních chyb v hodnocených webech je opravdu školáckých a dá se jim vyhnout dopsáním pár řádků kódu. Všechny tyto chyby a útoky, které tyto chyby využívají, jsou popsány v každé lepší knize o webovém programování a jsou obsaženy v každém školení webové bezpečnosti.

Weby jsem testoval na možnost vést proti nim útok Cross-Site Scripting, který je často označován zkratkou XSS a jeho princip spočívá v „podstrčení“ cizího JavaScriptu na stránku. Úspěšně provedený Cross-Site Scripting útok může vést až ke zcizení identity uživatelů, tedy k odcizení jejich přihlašovacích jmen a hesel. A to v podstatě bez nějaké rozumné možnosti detekce provozovatelem webu. Tento útok se dal úspěšně provést na přibližně polovině přihlášených webů.

Na čtvrtině hodnocených webů jsem úspěšně provedl další jednoduchý útok, který je známý jako Full Path Disclosure. Tedy česky něco jako „ukaž mi, kde jsou na serveru uloženy soubory aplikace“. Spočívá v tom, že web či aplikaci donutíme prozradit o sobě informace, které samy o sobě nejsou nijak zneužitelné (je to jenom cesta k nějakým souborům, nic víc), ale pokud tyto informace útočník má k dispozici, může je využít k dalším, mnohem závažnějším útokům.

Na několika webech bylo možné provést útok SQL Injection, tedy útok, který umožní změnit dotazy a data odesílané do databáze. Pomocí útoků tohoto typu lze například získat hesla všech uživatelů daného webu, nebo je rovnou smazat. Vtipnější varianty pak mění ceny zboží v různých obchodech, většinou směrem dolů. Nejzávažnější varianty pak umožňují získat uložené platební údaje uživatelů, především pak čísla kreditních karet. Samozřejmě za předpokladu, že je provozovatel webu uchovává.

Perličkou pak byly takové případy, jako možnost získat zdrojové kódy celé webové aplikace včetně uživatelského jména a hesla pro přístup do databáze, a to pouze pomocí webového prohlížeče a pěti minut času. Po objevení tohoto problému jsem si musel nalít sklenku dobrého vína, abych se trochu uklidnil.

Vtipnými problémy byly i takové možnosti, jako například anonymní odesílání e-mailu, které se využívá pro rozesílání nevyžádaných obchodních sdělení, tedy spamu, bez rozumné možnosti vystopování odesílatele. Tento problém se vyskytl na několika hodnocených webech.

O takových „drobných“ zranitelnostech, jako je například anonymní stahování jakýchkoliv souborů z internetu, snad nemá ani cenu psát. Pokud ale tyto drobnosti zkombinujeme s problémy popsanými výše, dostáváme do rukou mocný nástroj na páchání různé nekalé činnosti na internetu. No, neberte to.

bitcoin_skoleni

Tyto bezpečnostní problémy se netýkají jen webů vyrobených například v menších lokálních firmách, ale týkají se i nadnárodních korporací, bank a zavedených webových agentur. Stejně tak je jedno, v jakém programovacím jazyce je web napsán, jaký používá framework, či jakou má web barvu. Zástupci všech možných táborů na bezpečnost kašlou přibližně stejně.

Na závěr mi dovolte, abych shrnul toto shrnutí. Český web je na dobré cestě, z technického hlediska jde správným směrem a správnou rychlostí, používá moderní a světové postupy. Z hlediska zabezpečení webů a webových aplikací je také na té samé dobré cestě, ale nikam bohužel nejde, jelikož má zlomenou nohu. Pojďme jej tedy vyléčit a udělat vše proto, aby se podobná situace příště již neopakovala.

Autor článku

Michal Špaček je vývojář, školitel, přednášející a občasný lovec chyb. Umí vyvíjet webové aplikace, zajímá se především o jejich bezpečnost a výkon.