Osobní stránky

Nealfanumerický kód (Non-alphanumeric code)

V poslední době se na internetu objevilo několik článků zabývajících se kódem, převážně v JavaScriptu, kde nejsou použity žádné alfanumerické znaky. Princip je poměrně jednoduchý, všechny alfanumerické znaky, tedy a-z a 0-9 nahradíme výrazem, který je v daném programovacím jazyce ekvivalentní.

Nejedné se o novinku, původní myšlenka tohoto způsobu zápisu kódu je k využití zranitelnosti Cross-site scripting (XSS). Pokud je obrana  proti tomuto útoku realizována vynecháním nebo filtrováním alfanumerických znaků, lze tímto způsobem takovouto obranu jednoduše obejít.

Díky tomuto útoku je hlavná využití této možnosti nejvíce spojováno s JavaScriptem, ale lze použít i v ostatních jazycích. Hlavní myšlenka zůstává vždy stejná a výsledek se bude lišit pouze implementačními detaily konkrétního jazyka.

Dále se různé typy provedení různí použitými znaky, ze kterých kód potřebujeme generovat. Čím menší je množina použitelných znaků, tím delší bude kód provádějící stejnou operaci. Některé znaky ale v programu nahradit nelze a musíme je v programu zachovat. Například pokud chceme v JavaScriptu použít některou metodu objektu window, nelze nahradit znaky ( a ) za názvem metody. Dále pak musime použít znak _ u názvu konstant, například  __parent__. Stále ale platí, že v programu nebude žádný alfanumerický znak.

Při ochraně proti XSS bychom tedy neměli používat blacklist, což je vyjmenování zakázaných znaků, ale takzvaný whitelist, ten kontroluje jen povolené znaky. Při použití blacklistu se může jednoduše stát, že na některé znaky zapomenem, ať uz z nepozornosti, anebo kvůli tomu, že jsme nepředpokládali, že by tyto znaky mohly být nebezpečné, jako například u tohoto příkladu.

Nejčastěji je tento způsob úpravy kódu zmiňován právě s JavaScriptem, protože má největší uplatnění u XSS útoku. Vlastně mne ani jiné praktické využití nenapadá. Každopádně lze tento způsob aplikovat i na PHP.

Další zdroje:

Upozornění: Tento článek má sloužit k pochopení principů pro obranu před tímto typem zranitelností. V žádném případě nanabádá k využití tété chyby a autor nenese žádné následky způsobené nedostatečným zabezpečením proti této chybě.

Jakub Škvára


Jakub je cestovatel, blogger a webový vývojář. Zajímá se především o technické novinky a rád navštěvuje konference. Používá: Symfony2 Framework, AngularJS, NodeJS, MongoDB a další moderní technologie. Aktuálně žije v Londýně.