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.
Pojďme si web projít pěkně od začátku. První, co každý návštěvník vidí, je adresa webu, někdy též nazývaná jako doména, 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.cz i webtop100.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ě tzv. Cesty, která se uvádí za doménu, 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“ apod.
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, tak 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 pohovky 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, tak ve svém prohlížeči uvidí 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 toto již 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 jedinečný 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. Podle názvu by se mohlo zdát, že bude obsahovat nějaké umělecky ztvárněné postavičky robotů. Bylo by to rozhodně zajímavé, ale není tomu tak, tento soubor obsahuje sadu příkazů pro internetové vyhledávače, tzv. roboty. Především jim zakazuje, jaké stránky mají procházet. Takové zakázané stránky se pak nezobrazují ve výsledcích vyhledávání. Je dobré na webu takovýto soubor mít, a to i když bude prázdný. Ve statistikách návštěvnosti pak nebudeme mít Not Found chyby, protože tento soubor nešlo na našem webu najít, a roboti slídící po našich stránkách nám budou vděční. Samozřejmě pouze za předpokladu, že to tito roboti umí.
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, více času na hodnocení jednoho webu nebylo. 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, tak se jednoho dne 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é ohodnocení. 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 na serveru jsou 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, tak je může využít k dalším, mnohem závažnějším útokům.
Na několika webech šlo 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á. Jestli jste si ještě nepředstavili následky tohoto útoku, tak to raději ve svém vlastním zájmu ani nedělejte.
Perličkou pak byly takové případy, jako například 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, nedokázal jsem totiž pochopit, že si někdo za toto dílo mohl nechat vyplatit finanční odměnu.
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, neberte to.
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 táborů na bezpečnost kašlou přibližně stejně, a to více, než je zdrávo.
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: Michal Špaček