Flash 23. - zabezpečení

Chcete-li mi po dokončení své Flash hry cítit při jejím provozu na webu bezpečně, komfortně pohodlně a libovat si jak se vám vše daří, asi vás dnešní strategie ochrany Flashe znechutí! :)

Flash je hrozně bezpečný, opravdu …

Když vytvořím Flashovou aplikaci pro běh na serveru, stačí mi vědět, že Flash se formou SWF souborů ukládá v nerozkódovatelné podobě na formát FLA. Takže mi stačí posílat Flashem kódované proměnné a mám vyhráno. No není to tak úplně pravda!:)

Nejen že získat kód z SWF souborů lze pomocí řady programů (nejznámější jsou ActionScript Viewer a SWF Extractor), lze takto extrahovat hlavně vše, co ve Flashi uděláme. Že už to nezní tak idylicky, jak se mohlo na první pohled zdát? Ona totiž samotná bezpečnost Flashe jako celku není vůbec v současné době reálně možná! Pojďme se tedy podívat, jak na to, abychom si z této kaše pomohli alespoň trochu.

No dobře, Flash nejde nikdy ochránit úplně, má to tedy cenu?!?

Pokud přijmeme fakt, že jakékoliv naše úsilí strávené při vývoji flashové hry může při jakémkoli i nekomerčním řešení přijít nazmar velmi rychle, vyvstane nám otázka: „Co s tím?“, na kterou je odpověď poněkud komplikovaná a proto se na problém podíváme zeširoka.

Základní předpoklad pro to, že bude chod Flashové aplikace nekorektně prováděn, je ten, že NĚKDO bude podvádět. Naší výhodou je právě to, že člověk chybuje a na to, aby obešel řadu překážek a ani jednou neklopýtnul nemůže spoléhat ani on. Pokud jde o potencionální podvodníky, jak bývá zvykem, jejich složení je přímo úměrné důvodu, pro který podvádí. Pokud budeme mít na webu hru, která se bude hrát pouze o nejlepší skóre jen tak, asi to bude něco jiného než když bychom provozovali Flashovou hru o automobil.

Ať tak či onak, vždycky můžeme rozlišit dva tábory podvodníků, lammery, tedy nezkušené uživatele podvodníky, zkráceně „lamy“. Potom tu máme hackery, což jsou už zkušení mazáci, které jen tak neošálíme. Podobnou anabázi najdeme i v rozvrstvení tak populárních sprejerů – někdo maluje na zdi psací podpisy svého pravého jména, obvykle nezkušení teenageři, jiný „writer zase potaguje umělecky zeď na zakázku:)“. Nám postačí vědět, že „lam“ bude vždycky hodně a budou nás obtěžovat nabouráváním serverů potažmo flashových her o to více okatě, než si osvojí všechny triky!

Jak nejjednodušeji podvést Flashovou hru

Dnešní díl se bude zabývat ochranou, ne podváděním, ale určitě tak jako tak v kontextu postupů vyzní spíše jako návod na podvádění Flash her, nuže co už tedy. Nejsnazší cestou jak si zjednodušit flashovou hru, závisejícím na jejím žánrů, obvykle bývá si ji zpomalit. Pokud máme za časový limit mírně nadsazeně minout milion klád, půjde to jednodušeji, pokud budeme rychlost Flashe nějak zpomalovat.

O možnosti Flash zvětšit nad jeho původní velikost se nebudu tentokrát moc bavit, protože to je samozřejmě oproti dalším možnostem primitivní. Zpomalit počítač při hraní hry ve stránce kopírováním na disketu a dalšími záludnými činnostmi je totiž opravdu snadné. Ovšem pozor, zde je možnost měřit ve Flashi aktuální rychlost přehrávání a dostane-li se počet snímků za řekněme 20 sekund pod určitou hranici, hra se ukončí.

Kódujeme

V souvislosti se samotným zabezpečením Flashe zevnitř by jistě u položky kódování bylo na místě vzpomenout na oblíbený česko slovenský server Flashfun.cz/.sk, který je celý postaven na Flashové zábavě, hraní Flashových her na body a taktéž tyto hry i komerčně provozuje. Do jisté doby i Flashfun používal skvělý kódovací algoritmus. A to do té, než mu všechny hry začali podvádět uživatelé, kteří si ho pomocí v té době objevených k tomu určených programů zobrazili.

My si tedy stále musíme připomínat, že cokoliv vytvoříme ve Flashi je při troše snahy vždy simulovat. Taktéž kódování řetězců před odesláním na server je nám hodně platné, pokud jej dokáže podvodník vidět. Strategie zabezpečení Flashe ovšem nemůže být postavena na dokonalém principu, ale na maličkostech. A kódování řetězců, putujících na server, je jeden z nich.

Pokud mimochodem odešleme jakákoliv data z Flashe (což samozřejmě můžeme i bez otevírání nových oken jak jsme si v jednom z minulých dílů naznačili), jako návdavek není většinou problém pomocí programů jako URL Listener tyto pak zachytit. Pro kódování se ve Flashi dá použít hodně postupů, od jednoduchých algoritmů až po XOR či DES.

Jako každý bezpečnostní fígl, i tento odradí některé podvodníky. Vždy je však důležité brát v potaz za jakou cenu. V tomto případě za cenu zpomalení aplikace, protože Flash opravdu není nijak hvězdně výkonný nástroj a proto je zde třeba rychlost mít vždy na paměti. Z tohoto pohledu je XOR s proměnlivým klíčem optimální. Ideální je zmást nepřítele kombinací věrohodných operací s věrohodnými proměnnými, které také potom odesíláme na server, přitom však jde celou dobu pouze o falešná data, což mi poznáme poté na serveru:

score = XOR(score, kodovaciklic)

Další pomůckou, kterou znepříjemníme uživatelům podvádění je zacházení s klíčem pro kódování. Když ho ve Flashi nebudeme uchovávat, pouze ho dynamicky načítat ze serveru a po použití proměnou zničíme, opět budeme o něco lépe moci sledovat podvodníky. Sledování je totiž naše nejlepší zbraň, jak si za chvíli povíme.

Jak volit onen klíč pro kódování? Pochopitelně zde musíme použít buď náhodný generátor, nebo změť nesmyslných znaků které napíšeme. Možností je třeba pro každou hru konkrétnímu hráči vygenerovat vlastní kódovací klíč a ten uložit do SQL tabulky a pak s ním pracovat.

To je ale prasácký kód!:) …

Už jste někdy slyšel, že je váš kód nepřehledný, že se v něm nemůžete vyznat ani vy sami a že tohle napsalo nějaké prase? No tak v případě odrazení části „lam“ je i toto výhoda. Kromě klasického nepřehledného a různě poschovávaného kódu je zde ještě možnost hooků. To jsou metody, díky kterým odhalíme nepovedený pokus o hack.

Takto provedené matení může být třeba nelogicky pojmenovanými proměnnými a práce s těmi falešnými, protože kdo by čekal, že v proměnné score máme uložené fiktivní údaje a pracujeme s ním zcela zbytečně a proměnná mode nebo minimum zase nese pravé skóre. Rozhodně to někoho od podvádění odradí, pokud bude tápat v kódu.

Jako perličku bych zde zmínil to, že pokud by byla „lama“ natolik nezkušená, že by si ani neuměla ocrackovat demoverzi programu pro zobrazení zdroje Flashe, nemusela by vidět kód, který je uložen ve složitějších objektových strukturách, nebo třeba snímku 10 na časové ose. Ale to už je spíše kuriozita, pro z toho snad plyne poučení – neumísťovat pokud možno na úvodní snímky hlavní programový kód:).

Spolupráce se serverem

Pokud bude mluvit čistě za sebe, jednou z nejlepších možností, které k ochraně Flashe používám, je bezesporu monitoring. Základem všeho je, že uživatel, který chce vyhrát cenu musí zadat své skutečné údaje. Podvodník který nechce vyhrát sice nemusí, ale to nechme stranou. Každopádně pokud chceme kontrolovat chování konkrétních uživatelů na serveru, máme k tomu snadný postup.

Pokud si uložíme uživatele se vstupem do systému do tabulky monitoringu uživatelů spolu s časem a jeho IP, totéž uděláme pokud vstoupí na herní stránku, začne hrát a vygenerujeme mu kódovací klíč, poté po dohrání hry taktéž tyto údaje na server pošleme, můžeme si udělat snadno obrázek o tom, jak dlouho hráč hru hrál. Pokud nahraje skóre, které bude podle naší přepočetní tabulky v systému vyšší než jaké mohl dosáhnout, máme bod.

Stejně důležité je i v případě, že hráč odešle na server nějaká nepředložená data, toto zapsat, abychom ho potom za podvodníka mohli označit. Na toto všechno může být matení protivníka v samotném Flashi.

Dynamický obsah

Vraťme se tedy ještě k možnostem, jak takovým podvodníkům znepříjemnit život. I když v případě her je to mnohdy neúnosné, protože rychlost jejich připojení na internet je mnohdy pro nás nepřijatelná a nemůžeme udržet nepřetržité spojení se serverem. Tak či tak můžeme při běhu hry několikrát coby mezi výsledek odeslat kontrolní herní proměnné.

Include

V nových verzích Flash již najdeme možnost #include, díky které můžeme ze serveru načítat i skripty. Opět ve spojení s dalším zabezpečením nabývá metoda na účinnosti. Při použití PHP a ASP skriptů si na serveru můžeme ověřit, zde je spouštěn Flashem, nebo podvodným způsobem. A při použití externí autentizace ve Flash tak můžeme snadno zobrazování externích Flash skriptů ze souboru řídit.

Server

Obecně vždy platí, že veškerá uživatelem odeslaná data na server nejprve zkontrolujeme a při jakékoliv odchylce od jejich standardu jednáme. Základem všeho je opět mít na paměti, že data posílaná z Flashe pomocí metod POST a GET lze volně zaměnit za jiná. Zde se tedy vyplatí ono kódování odesílaných výsledků a dat, ničemu neuškodí k nim podle daných regulí připojit i některé kontrolní výpočty atd..

I když to v této souvislosti může vypadat směšně, je nutností posílat také heslo uživatele kódované třeba pomocí MD5, aby nemohl někdo hrát za jiného uživatele. Což bychom mohli ošetřit tak, že se před hrou nezalogoval do systému nebo neprošel řádně tvorbou hry a podobně.

Další možnosti je použití komunikace s využitím SSL – Secure Socket Layer, tím si ujasníme, odkud jsou data přijaty. To že hackování většinou dělá sám klient ale tuto možnost ve spojením s tím, že je finančně poměrně náročná na implementaci, netvoří již tak atraktivní.

Vzhledem k možnostem serveru je samozřejmě možné data na něm zpracovávat a zabezpečit různě, ale naší slabinou zde bude pořád Flash. Abychom komunikaci mezi ním a serverem mohli mít pořád kódovanou. To samozřejmě bez umístění klíče do Flashe nelze jinak než třeba poprvé odeslat falešná data a při druhém dotazu již ta správná, opět hrajeme pouze o to, kolik „lam“ odhalíme.

Více hlav víc ví. Tedy většinou. V případě používání více klíčů pro kódování opět ztěžujeme podvádění všem nečestným hráčům. Takovéto klíče opět pořád dokola posílá server, zabezpečení se tím tedy nijak nemění.

Další možností, kterou máme, je samotný Flash na serveru generovat. Dynamická tvorba SWF souborů na serveru pomocí volně dostupných knihoven pro PHP i ASP je sice dobrá věc, ale nelze díky náročnosti na provoz na serveru také příliš hojně využívat, navíc tím pouze částečně ztížíme získání kódu hry podvodníkům.

Pokud tedy umístíme logiku hry na náš server a ne do Flashe, je to samozřejmě výhoda. Flashem potom pouze budeme reprezentovat grafickou část hry. Zde bych zmínil, že na takovémto principu se chystá u nás první multi-playerová flashová webová strategie – Monarchia. Co si budeme povídat, ani tato hra není postavena do závidění hodného postavení, protože pokud by se hrála o ceny, jistě by si na ní podvodníci smlsli. Přece jenom zase tolik Flashových her o ceny u nás neběží a hacker z něčeho žít musí:). Což mne přivedlo k hezkému příkladu prolomení Flashové hry u opravdu obstojného konkurenta, totiž Oskara, kde se zabezpečení příliš nevěnovali.

Další možnosti

Mými oblíbenými možnostmi zabezpečení jsou různé znalostní kvizy, kterým posíláme odpovědi na otázky a po všech odpovědích se nám zapíše skóre do tabulky aniž bychom viděli, kde jsme chybovali. Taktéž zajímavou možností je po dokončení hry provést na živo souboj nejlepších hráčů v jí samotné, aby se oprávněnost jejich vítězství alespoň nějak ověřila.

Co dělat tedy s uživatelem, u kterého zjistíme, že například hraje hru na celkové herní skóre nonstop 4 dny s dokonce stejnými časovými intervaly +- mezi jednotlivými hrami, nebo u něj máme z jiného důvodu podezření na podvádění (komické je, když například hraje 5 her zaráz úspěšně, a v pravidlech hraní máme uvedeno jednoho hráče na jeden účet)?

Jak na podvodníky?

Při zjištění, odhalení, podvodníka je důležité nepanikařit. Jednak takových lidí bude opravdu hodně, pokud naše hra bude na určité úrovni co se týká výher apod., máme ale na druhou stranu radost že jsme ho odhalili! Jednou z variant je nechat hráče dohrát hru a poté provést vyhodnocení, při kterém ty a ty hráče anulujeme z celkových výsledků, popřípadě i hráče hrajících z jedné podvodné IP adresy.

Pro anulování hráčů ze hry o ceny je taky důležité vše mít právně ošetřeno v pravidlech hry, aby se s námi za to nemohl někdo poté soudit. To by nám totiž rozhodně na sebevědomí při anulování herních účtů nepřidalo. Potom je zde druhé kritérium, u hráči, u kterého si nejsme jisti podvádění, je lepší mu smazat účet s tím, že bude o jednoho poctivého hráče méně, nebo ho nechat hrát dál a v nejhorším případě tu bude jeden podvodník navíc? Já se kloním k první možnosti.

Náklady na zabezpečení

Rozhodně důležité je brát při vývoji Flashových her, nebo aplikací, v potaz náklady na jejich bezpečnost. Je sice hezké zabývat se zabezpečením hry do nejmenších detailů, zautomatizovat kontrolu podvodníku a po ukončení hry je automaticky anulovat, ale každý špás něco stojí a ne každý zadavatel zakázky dokáže pochopit, proč vynaložit takové náklady na zabezpečení, které přitom nemusí být nijak závratně účinné.

S tím samozřejmě souvisí, že dát do soutěže, o které může každý říct, že je to podvod, cenu za 100 000, není nejvhodnější. Flash se i z pohledu sponzorů a poskytovatelé výherního zázemí hodí spíše pro hry o malé a střední ceny, protože i u takto koncipovaných soutěží budeme jistě čelit značnému náporu podvodníků.

Důležité tedy v závěrečném shrnutí pro nás při ochraně Flashových her potažmo aplikací je snažit se co nejvíce:

  1. Zabezpečit manipulaci s daty ve Flashi.
  2. Zabezpečit odchozí data na server a příchozí data do Flashe.
  3. Monitorovat každého hráče nejlépe automatizovaným systémem.
  4. Po ukončení hry anulovat podvodníky.

Příště …

… nahlédneme do zákulisí práce s matematickými výrazy ve Flashi.

Diskuze (6) Další článek: Logitech uvede superbedny - 450W, THX, DTS, ...

Témata článku: , , , , , , , , , , , , , , , , , , , , ,