Co dokáže znaménko aneb neobvyklý nákup na Seznam TIP

Zdroj: SOOM.cz [ISSN 1804-7270]
Autor: .cCuMiNn.
Datum: 16.5.2011
Hodnocení/Hlasovalo: 1.19/43

Před nedávnem spouštěl Seznam.cz novou službu Seznam TIP se zvýhodněnými nabídkami služeb a zboží. Tato služba se do povědomí uživatelů dostala hlavně díky úvodní akci na automobily Škoda Fabia za cenu 25Kč.

Jednotlivé tipy jsou zobrazovány přímo na titulní stránce Seznamu nebo na adrese tip.seznam.cz. Nabídky jsou přitom limitované maximálním množství kupónů, viz. citace z nápovědy k uvedené službě:

"Nabídky jsou ovšem limitované maximálním množstvím kupónů, které lze prodat. Musíte tedy přijít včas, než se všechny kupóny vyprodají."

Během svého pravidelného testování služeb Seznamu jsem se před pár dny zaměřil právě na tuto službu. Stanovil jsem si za cíl získání nějakého toho kupónu a samozřejmě, že ne za plnou cenu. Příznivá by byla cena nulová, nebo alespoň nižší, než za jakou jsou kupóny nabízeny.

Během testování přišel na řadu oblíbený lokální HTTP proxy (v tomto případě jsem použil doplněk pro Firefox TamperData). Ten mi umožnil zachytávat a pozměňovat komunikaci mezi mým browserem a webovým serverem. Při koupi kupónu se na stranu serveru odesílá jednak údaj o objednaném množství a prostřednictvím skrytého pole formuláře také samotná cena objednávaného zboží. Už jsme si zvykli na to, že je možné v některých e-shopech změnou hodnoty v tomto poli definovat cenu, která se nám líbí daleko více, než cena originální. Během testování se tedy toto pole stalo mým prvním cílem.

Vývojáři ovšem proměnnou, která předává cenu zboží, správně ošetřili a jakákoliv změna její hodnoty tak nevedla ke kýženému výsledku. Zaměřil jsem se proto na další cíl - proměnnou předávající objednávané množství. Tato hodnota je pro uživatele z důvodu omezeného množství dostupných kupónu omezena pouze na určitou maximální výši dle konkrétní nabídky.

Když už se mi tedy nepodařilo zmanipulovat prodejní cenu nabízeného zboží, začal jsem si pohrávat s myšlenkou, zda by objednání záporného množství nemohlo v konečném důsledku vést k překlopení ceny do záporných hodnot. Tím by se podobně jako u dobropisu vyměnily role plátce a příjemce finančních prostředků. Teoreticky by se tak (při vhodné konstalaci hvězd) mohlo stát, že by prodávající odeslal finanční částku na můj účet, aby se zbavil záporného údaje.

Ve službě TIP se ale nikde nezadává číslo účtu plátce. Ani po delším testování by tak nejspíš nebylo možné uvedeného cíle dosáhnout. Zbývala tedy poslední varianta - objednat si nejprve záporné množství kupónů a následně pod stejným uživatelským účtem také jejich stejné kladné množství. Tím by se vyrovnala částka určená k úhradě a teoreticky by z toho nakonec mohl nějaký ten kupón kápnout mimo ochranné bariéry.

Objednal jsem si tedy -1 (mínus jeden) kus kupónu za cenu 490Kč. Díky tomu, že bylo sledováno pouze překročení maximálního povoleného množství objednávaných kupónů, prošel tento požadavek hladce kontrolními mechanismy a já během krátké chvíle obdržel informační e-mail, který mi sděloval data o bankovním účtu, na který mám uhradit -490Kč (mínus 490Kč).

Ani ve snu by mě nenapadlo, jaké následky bude odeslání tohoto jediného požadavku směrem na webový server mít. Uběhlo sotva pár minut a můj účet na Seznamu byl zablokován, aby z něj nemohlo dojít k dalšímu narušení. Protože jsem ve spojení s odpovědnými lidmi v Seznamu, následoval neprodleně také telefonát. Ten mě informoval o skutečnosti, že se mi zadáním záporné hodnoty podařilo vykoupit (zarezervovat) všechny dostupné kupóny. Žádné další tak již nebyly dostupné pro ostatní uživatele.

Můj původní cíl, který jsem si na samém začátku stanovil, se tedy zrovna nepovedl. Vedlejší efekt, který můj požadavek způsobil, totiž celou akci prozradil dříve, než mohl být případný zdar testu prakticky ověřen. Na druhou stranu i samo teoretické vykoupení všech kupónů s celkovou zápornou cenou, bylo také zajímavým výsledkem.

No a jaké z tohoto případu plyne ponaučení? Pokud chceme hodnotu vloženou uživatelem shora omezit, neměli bychom zapomínat také na omezení zdola. Zvláště pak v případech, kdy s hodnotou pracujeme jako s číselným typem unsigned, který pracuje jen s kladnými čísly a záporná čísla bere jako nejvyšší čísla kladná. Nasazením této kontroly se můžeme vyhnout nepříjemným překvapením.