26. července 2008
Během čtyřleté historie vývoje a správy pokecu na stránkách Ujdeto.cz si dovoluji tvrdit, že o zabezpečení chatů a diskusních for vím více než většina průměrných programátorů. V tomto programátorsko - psychologickém článku bych rád zejména začínajícím a lehce pokročilým programátorům poradil, co by měli dělat proto, aby byl jimi naprogramovaný internetový svět krásnější a pokud možno bez produktů internetových škodičů - ať již z řad těch nejprimitivnějších internetových diskutérů, nebo naopak pekelně chytrých skoro-hackerů.
Jistě jste již někdy narazili na diskusní forum, které bylo doslova vytapetováno nejrůznějšími odkazy na nákup viagry, porna nebo warezu. Pokud jste náhodou žili v domnění, že existují úchylní prodejci, kteří nemají na práci nic jiného, než tapetovat diskusní fora v každé zapadlé stránečce, tak vězte, že tomu tak rozhodně není. Tito prodejci pouze využívají reklamní SPAM roboty, kteří sami prohledávají a skenují celý web (podobně jako googlebot), a jakmile narazí na nějaký formulář, okamžitě se jej pokusí vyplnit reklamou.
Jakkoli tato myšlenka může na první pohled vypadat složitě, v praxi je velice jednoduše realizovatelná. Adresu zpracovávacího skriptu lze snadno nalézt v elementu FORM, a pokud se všechny formulářové elementy mezi FORM a /FORM vyplní nějakým textem, je úspěch u většiny jednodušších diskusních for zajištěn.
Jen dodám, že identifikovat, kam napsat reklamní sdělení, je velice jednoduché (pro text se obvykle používá element TEXTAREA). Většina políček pro vyplnění emailu ve všech běžných jazycích navíc obsahuje v názvu (atribut name) slovo "mail".
Do ostatních políček poté stačí přidat libovolný text (poslouží například jako jméno) a může se vesele posílat.
Co se proti tomu dá dělat? Existuje mnoho více či méně jednoduchých možností.
Nejjednodušší obrana spoléhá na fakt, že spam roboti neznají význam políček, která vyplňují, a neumí CSS. Pokud například přidáte do formuláře políčko (nejlépe textareu) se jménem nevyplnovat a schováte jej pomocí CSS (aby jej většina uživatelů vůbec neviděla a neměla tendenci jej vyplnit; ze slušnosti vůči uživatelům bez podpory CSS políčko nevyplnovat doplňte ještě textem "Nevyplňujte"), budete vědět, že máte požadavky s vyplněným políčkem nevyplnovat ignorovat jako SPAM.
Nejpoužívanější obranou proti SPAM robotům je dnes zřejmě tzv. "captcha" – text v obrázku, který musí uživatelé opsat, aby mohli příspěvek publikovat. Přestože není zase tak velký problém naprogramovat robota, který bude umět kód z obrázku rozluštit a následně vyplnit, v praxi se to příliš nedělá - variabilita obrázkových kódů je příliš veliká a časová náročnost je vždy daleko vyšší než nalezení nějakého jiného diskusního fora, které zatím ještě captchu nepoužívá.
Nevýhodou obrázkových kódů je někdy jejich přílišná složitost (někdy má problém captchu rozluštit i průměrně inteligentní člověk) a problémy s nevidomými (proto bývá captcha na navštěvovanějších serverech doplněna zvukovou alternativou).
Praktické řešení obrázkového kódu v PHP je následující: Do formuláře přidáte políčko pro vyplnění captchi a obrázek, který bude generovaný PHP skriptem (náhodná kombinace znaků, jejich vykreslení pomocí funkcí GD2 knihovny a uložení vygenerovaného kódu do session). Před publikováním příspěvku pouze ověříte, zda vyplněný kód odpovídá tomu, který je uložen v session. Nezapomeňte před každým zobrazením stránky kód v session vynulovat (obrázek se stáhne vždy později než se vygeneruje stránka, takže se kód do session nastaví správně) a kontrolovat, zda byl vůbec nějaký kontrolní kód vyplněn.
Poslední obranou, kterou zmíním, je použití javaskriptu. Přestože si tím odříznete zlomeček procenta potenciálních přispěvovatelů (kteří používají například Lynx :-)), získáte velice pohodlnou ochranu proti všem SPAM robotům (a pokud napíšete kód dostatečně prasácky, tak možná i polovině rádobyhackerů, kteří nebudou používat Wireshark a místo toho se budou snažit kódem přelouskat). Javascript a AJAX je věc, kterou se SPAM roboti dle mého názoru ještě hodně let nenaučí používat, a přitom je <form action="#" onsubmit="postByAjax(this);return false;"> ... </form> tak jednoduchý (pozn. funkci postByAjax si budete muset naprogramovat sami, nejedná se o existující funkci v javascriptu).
Internet je doslova zaplaven idioty, kteří nemají nic jiného na práci, než celý den sedět u počítače a psát nějaké vulgární výkřiky do tmy nebo dokonce útočit na slušné uživatele chatu (diskusního fora apod). Tito lidé jsou naštěstí tak hloupí a internetově nevzdělaní, že jim obvykle stačí zablokovat přístup na základě IP adresy (blokovat přístup na základě session nebo cookie nedoporučuji, smazat to dnes umí kdekdo).
Nevýhodou tohoto řešení ještě nedávno býval fakt, že mnoho uživatelů bylo schováno za jedním proxy serverem (v práci, ve škole,...) a stačil jeden idiot na to, abyste o všechny tyto lidi přišli. Dnes s rozvojem vysokorychlostního internetového připojení význam proxy serverů upadá, takže se nemusíte toto řešení bát použít.
Na základě čeho, kdy a jak blokovat přístup? Předně je zapotřebí si uvědomit, že blokování přístupu je pro Vaše stránky velice nepříjemná situace, kterou ostatní uživatelé mnohdy špatně nesou (viz výpady na Idnes typu "cenzor je debil"). Proto je velice vhodné tuto funkci neprovádět sám, ale delegovat ji na starší, zkušené a ověřené uživatele (mělo by jich být víc). Není zapotřebí jim nic platit – postačí jim pocit moci.
Nemusíte se bát, že tito lidé budou na stránkách své moci extrémně zneužívat – kdo má moc, ten o ni obvykle nerad přichází. Naopak delegováním moci cenzorské si tyto lidi více zavážete a budou na stránky chodit častěji a radši.
Co funguje na Ujdetu, kde existuje již poměrně početná "šlechta", to zatím nefunguje na Vyplňto (resp. zde na blogu, kde je kecárna sdílená) - cenzorskou pravomoc není komu svěřit, protože kromě idiotů do kecárny nikdo moc nepíše (prázdnota i idioti silně odpuzují slušné lidi).
V takových případech je zapotřebí dočasně přistoupit k automatické cenzuře na základě obsahu. Na tvůrci stránek je poté již pouze rozhodnutí, zda nevhodnou zprávu publikovat a následně ostatní uživatele informovat o tom, že na základě zprávy byl dotyčný zabanován, nebo zda zprávu vůbec nepublikovat a zabanování provést skrytě (na klady a zápory jednotlivých řešení není těžké přijít).
Kromě publikování vulgarismů mají idioti i jiné zvyky, proti kterým je vhodné se bránit. První ze zvyků bych pojmenoval rčením Mnoho zajíců, psova smrt. Pokud se idiot s někým hádá a nemá argumenty, obvykle začne psát do diskuse pod více přezdívkami. Řešením je vygenerování jedinečného identifikátoru na základě IP adresy, který se u přezdívky ukáže. Ostatní pak snadno poznají, že se jedná o stejnou osobu, a idiot je všem jen pro smích (obvyklá obrana je, že se parta kamarádů střídá u jedné klávesnice před jedním monitorem - schválně, jestli ji taky uslyšíte :-).
Druhým zvykem idiotů je tzv. falešná identita, kdy idiot záměrně píše pod jménem jiného uživatele diskuse, a snaží se jej tímto způsobem zesměšnit nebo znepřátelit s ostatními lidmi v diskusi. Částečným řešením je samozřejmě výše zmíněné uvedení identifikátoru na základě IP adresy, ale jelikož si jej mnoho lidí obvykle nevšímá, bývá nutné časem přikročit k vytváření registrací (registrované uživatele poté stačí barevně nebo ikonkou odlišit a jsou nedotknutelní).
Často se terčem falešné identity stává administrátor nebo jiný člen nějaké užší skupiny lidí (ano, často se terčem podobných útoků stává moje osoba :-)) Řešení je v takovém případě poměrně jednoduché a nemusíte přistupovat k vynuceným registracím - vymyslete si přezdívku, která není příliš běžná (například Marekzprahy :-)) a zakažte ji všem používat (ignorujte zprávy poslané tímto jménem nebo rovnou banujte). Dále si vymyslete svoji alternativní přezdívku (třeba 45fa), pomocí které budete psát na chat vy sami. Těsně před vložením zprávy tuto alternativní přezdívku (45fa) přejmenujete na svou skutečnou přezdívku (Marekzprahy) a budete moci nerušeně psát.
Třetím nejčastějším zvykem idiotů a částečně i rádoby hackerů je tapetování - ať již stejnými zprávami, nebo smajlíky. Doporučuji všem:
Ze všech škodičů nejzákeřnější jsou ti vzdělaní a pekelně chytří. Škodí většinou buď z důvodu, že se s Vámi nějak nepohodli (přebrali jste jim na chatu holku,...), nebo z hecu – soutěží s Vámi v tom, kdo je větší hacker. Ve své podstatě mám tento typ škodičů docela rád, protože jsou to právě oni, kteří mé znalosti posouvají někam dál.
Zabanovat tyto lidi pomocí IP adresy je neefektivní – velice snadno a rychle si totiž IP adresu dokáží změnit (restartem modemu nebo častěji použijí jeden z tisíců volně dostupných anonymních proxy serverů). Samozřejmě máte možnost "všechny" tyto servery proaktivně zabanovat (seznamů těchto serverů je na googlu mnoho, ale počet serverů není nekonečný), ale kdo by si touto sbírkou dobrovolně zasíral databázi a snižoval výkon chatu? Nemluvě o pracnosti tohoto řešení.
Dlouho jsem si lámal hlavu, jak nad takovými lidmi vyzrát. Jednou z možností je místo banu předstírat poruchu. Nezabanovali jsme tě, ale sorry, někdo nám stránky hacknul a prostě to nejede. Vrať se později. Nějakou dobu to skutečně pomůže (samozřejmě ne s tímto textem :-)), nicméně po čase škůdce napadne IP adresu změnit a najednou zjistí, že stránky celou dobu jely normálně (málokterý webmaster nechá stránky "dole" déle než den). Příště Vám na to neskočí a jakmile uvidí 501 Internal Server Error, okamžitě si IP adresu změní a pojede vše nanovo.
Finálním řešením se nakonec ukázal skrytý ban, který vychází z filozofie škůdce. Škůdce nepotřebuje vkládat své výpady do diskuse, nejde mu o vložení dat do Vaší databáze. Důležité pro něj je, aby jeho výpady někdo četl a aby na ně pokud možno reagoval – jednoduše bez obecenstva ho to nebaví.
Skrytý ban spočívá v tom, že se škodičovy zprávy do databáze uloží s příznakem "skrytý ban", přičemž se tyto zprávy nebudou vůbec běžným uživatelům chatu (diskuse) zobrazovat. Zobrazí se pouze škodičovi – a Vám. Měli byste dále tu a tam reagovat na jeho výpady, můžete si s ním i psychologicky hrát, ale dělejte všechno proto, aby nepojal žádné podezření, že něco jako skrytý ban existuje nebo že ho dokonce má.
Škůdce bude frustrovaný, že na jeho výpady reagujete pouze vy (občas!), zatímco ostatní jej zcela ignorují. Dokonce mu ani neodpovídají na pozdrav!
Existuje určitá pravděpodobnost, že škůdce z Vašich stránek brzy odejde, zejména pokud nenavázal s někým jiným bližší kontakt a nevyměnili si ICQ. Pokud se však jedná o opravdu chytrého škodiče, tak na to jednou přijde (z mé zkušenosti cca za dva týdny). A věřte mi – vůbec mu to nepomůže, spíše ho to zlomí. Dobře ví, že pokud si změní IP adresu a bude opět útočit, znovu dostane skrytý ban.
Nebude vědět kdy. Nebude vědět, zda má obecenstvo nebo ne. Odejde.
Publikováno dne 26. 07. 2008 v kategorii Programování
Odhadnutá klíčová slova BETA: chat | programovani chatu | proti | php | ip | jak blokovat stránky | jak zabezpečit chatu | forum | zabezpečení
Mohlo by Vás zajímat BETA: 5 dobrých důvodů, proč ukládat uživatelem nahrané soubory do databáze
O kategorii Programování
V nejodbornější kategorii tohoto blogu jsou zařazeny články s mými programátorskými zkušenostmi získanými několikaletou praxí tvorby stránek a java aplikací pro mobilní telefony.
nick519 (dne 31. 07. 2008 v 15.09)
Sakra to je dobrej nápad!
Gratuluju....asi si něco takovýho taky udělám... :-)
Robert - [email schován] - web (dne 26. 02. 2009 v 21.04)
Dobrý. Budu muset u sebe taky něco vytvořit. Leze mi tam denně tak 5-10 lidí, a přitom zatím forum nějak moc neužívám, pouze ho mám připravené.
yx (dne 05. 04. 2009 v 16.40)
yx
Marty (dne 22. 05. 2009 v 08.33)
zajímavej nápad, ale ještě k těm souhláskám, víš že v češtině existuje slovo čtvrthrst? a to je trochu víc než 5 souhlásek... i když je asi pravda že tohle slovo moc lidí nezná :)
Programátor, samozvaný hodnotitel a zejména kritik.
Pan Vyplňto.cz a tvůrce několika webových stránek.