Neprůstřelné heslování v JavaScriptu

5. února 2003

Nabubřelý název článku je pochopitelně dost nehorázná nadsázka – o pořádném zabezpečení nemůže být při použití JavaScriptu ani řeč. Pokud ovšem potřebujete omezit přístup na nějakou stránku pomocí hesla, přičemž cílem je především odradit náhodné zvědavce a na bezpečnosti až tak nezáleží, může se vám hodit následující skript. Ostatně, dokážete odhalit kód za méně než 5 minut? Předpokládám, že pro čtenáře Intervalu by to mělo být hračkou.

Odhalit skryté heslo pro přístup na tajnou stránku není příliš těžké, přesto je to pro potencionálního „narušitele“ o stupínek obtížnější než ono obvyklé „kouknu do skriptu…najdu heslo…napíšu heslo“. Podívejte se na úvodní stránku příkladu. Uspějete-li, zobrazí se vám stránka s tajnou informací. Pokud byste při luštění kódu neuspěli, zde je ukryt přístupový kód.

Princip

Celý skript je postaven na jednoduché myšlence – přístupový kód (číselný) na „tajnou“ stránku není nikde ve skriptu uveden, neboť místo toho, abychom tento kód ověřovali, vygenerujeme přímo URL stránky nějakou matematickou operací z jednotlivých číslic kódu. Výsledná „tajná“ URL pak vypadá například takto: „123-456-78-9.htm“. Ochranu proti nalezení tajné stránky pak za nás dělá samotný server, pokud je na něm zakázán výpis obsahu adresářů, uživatel se teoreticky dozví pouze adresář, v němž je daná stránka uvedena, a dál se nedostane.

Výše uvedené ovšem platí se značnými výhradami. Spoléhat se na to, že uživatel nezíská výpis obsahu adresáře, zveřejněného na webu, je politika mírně řečeno ošidná. Druhým zádrhelem je samotný kód, z uvedeného klientského skriptu lze snadno zjistit jeho délku a množinu znaků, z níž se může skládat. Kromě toho, přesměrovávat uživatele při každém zadání chybného hesla na stránku 404 také není příliš estetické, proto jsou do skriptu zabudovány filtry, které evidentně chybné kombinace vyřadí ihned. Čím budou tyto filtry přesnější, tím větší komfort uživateli poskytnou, ale také zároveň odhalí více informací o kódu. Odborník i pokročilejší uživatel tak na první či druhý pohled zjistí, že možných kombinací ve skutečnosti není mnoho. Ještě jednou tedy opakuji, že uvedený skript není zabezpečením v pravém slova smyslu, je to jen a pouze nepříjemná překážka v cestě, která má odradit zvědavce, ale neodolá vážnějšímu útoku.

Popis skriptu

Se znalostí výše popsaných funkčních limitů nyní přistupme k samotné implementaci. Jak jste si jistě všimli, příklad je ozvláštněn nahrazením tradičního textového pole pro zadávání hesla imitací klávesnice číselného zámku. Nejprve tedy k této funkčnosti.

Pro vysvícení tlačítek klávesnice použijeme obvyklé „překlápění“ obrázků. Nejprve (například v hlavičce stránky, ale lze jako vždy použít i externí .js soubor) nahrajeme všechny použité obrázky do cache…

var i;
for(i=0; i<=11; i++ ){
    eval( „tempimagelo“+i+“ = new Image();“);
    eval( „tempimagelo“+i+“.src=\““+i+“lo.gif\““ );
    eval( „tempimagehi“+i+“ = new Image();“);
    eval( „tempimagehi“+i+“.src=\““+i+“hi.gif\““ );
}

…a definujeme funkci Swap pro překlápění obrázků:

function Swap( index, fHi ) {
    var ii= eval( (fHi ? „tempimagehi“ : „tempimagelo“) + index);
    document.images[„i“+index].src=ii.src;        
}

V těle stránky jsou jednotlivé obrázky tlačítek zarovnány v tabulce, avšak celý HTML kód tabulky zde pro jeho délku uvádět nebudeme (bude uveden v příloze článku). Důležité jsou pouze kódy na jednotlivých číselných tlačítkách, ty jsou konstruovány takto…

<a href=“javascript:AddNr(1)“ onMouseOver=“Swap(1,true)“ onMouseOut=“Swap(1,false)“>
    <img name=“i1″ border=“0″ src=“1lo.gif“ width=“100″ height=“50″ alt=“1″>
</a>

…a dále kód tlačítka „Clear“, ten vypadá následovně:

<a href=“javascript:ClearNr()“ onMouseOver=“Swap(10,true)“ onMouseOut=“Swap(10,false)“>
    <img name=“i10″ border=“0″ src=“10lo.gif“ width=“210″ height=“50″ alt=“Clear“>
</a>

Pro uložení aktuálně zadané části přístupového kódu definujeme pomocné pole numbers a proměnnou nrcount, která drží počet již zadaných číslic:

var numbers=[0,0,0,0,0];
var nrcount=0;

Z klávesy Clear je volána funkce ClearNr, která nuluje již vložený kód, tedy nastavuje délku tohoto kódu zpět na nulu. Kromě toho také zhasne čtveřici „svítivých diod“ pod číselníkem:

function ClearNr() {
    for(i=1; i<=4; i++ ) {
        document.images[„a“+i].src=tempimagelo11.src;        
    }   
    nrcount=0;
}

Hlavní částí kódu je funkce AddNr, která přidá znak právě stisknuté klávesy do zadávaného kódu a rozsvítí svítivou diodu na příslušné pozici. V případě, že délka kódu dosáhla čtyř číslic, provede tato funkce dále základní ověření platnosti kódu, u „pseudosprávného“ kódu vygeneruje URL a pokusí se naň přesměrovat, u chybného kódu zadané číslice smaže (pro nové zadání) a pouze zobrazí chybové hlášení.

var numbers=[0,0,0,0,0];
var nrcount=0;
function AddNr( nr ) {
    if(nrcount<4) {
        nrcount++;
        numbers[nrcount]=nr;
        document.images[„a“+nrcount].src=tempimagehi11.src;        
    }
    if(nrcount==4) {
        if( ( numbers[1]+numbers[2]+numbers[3]+numbers[4] != 16 ) || ( numbers[1]+numbers[3] != 11 ) ) {
            alert(„Špatný kód!“);
            ClearNr();
        } else {
            var strUrl = String(numbers[1]+numbers[2]+numbers[3]+numbers[4])
                + „-“ + String(numbers[1]+numbers[4])
                + „-“ + String(numbers[2]*numbers[3]) + „.htm“;
            alert( „Kód ověřen, přesměrovávám na “ + strUrl );
            window.location.href = strUrl;
        }
    }
}

A to je vše. Kompletní kód příkladu včetně obrázků je vám k dispozici. Nezapomeňte se o své úspěchy při luštění kódu podělit s ostatními v připojené diskuzi Intervalu – bude jistě zajímavé, nakolik je tento typ ochrany odolný vůči průměrnému čtenáři odborného média.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Předchozí článek Internet v Evropě
Další článek redboss.cz
Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *