Jak zabezpečit chat nebo diskusní forum proti škůdcům

26. července 2008

Programování

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ů.

Hrozba první - SPAM roboti

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.

Upozornění: Nikdy pro psaní příspěvků na chat nebo diskusní forum nepoužívejte metodu GET, vždy používejte metodu POST. Kromě vyšší bezpečnosti přenosu (velikost dat poslaných metodou GET je u prohlížečů omezena) budete i připraveni na inovaci googlebotu, který bude v budoucnu zřejmě i proaktivně vyhledávat skrytý obsah v databázích.

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.

Poznámka: U kontaktních formulářů, které rozesílají emaily, si dejte pozor na zadávání korektní emailové adresy. Pokud po člověku požadujete emailovou adresu (pro odpověď na dotaz, objednávku,...), vždy ji zkontrolujte pomocí regulárního výrazu. Jinak pokud například v PHP použijete konstrukci:
 mail("info@example.cz","Objednávka",$_POST["zprava"],"From:".$_POST["email"])
bude si moci kdokoli do políčka E-Mail přidat jakékoli jiné emailové hlavičky, včetně například skryté kopie. Takto se poměrně "beztrestně" rozesílá veliké procento SPAMu (zbytek vesměs využívá nezabezpečené SMTP servery). 
Osobně používám v php následující funkci pro ověření emailu:
  function checkEmail($email) {
   return preg_match("/^([a-zA-Z0-9._-])+([a-zA-Z0-9._-])*@([a-zA-Z0-9_-])+.([a-zA-Z0-9._-]+)+$/" , $email);
  }

 

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.

Poznámka: Složitost obrázkového kódu by měla být přímo úměrná efektům, které mohou spammeři dosáhnout publikováním reklamy na Vašem serveru. Méně významným stránkám bohatě stačí úplně primitivní kód bez jakýchkoli čar (nebo dokonce textová alternativa typu "vyplňte, kolik je 1+1"). U stránek, kde hrozí, že si někdo dá tu práci, aby speciálně pro ně napsal OCR, musí být složitost a variabilita captchi podstatně vyšší.

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).

Hrozba druhá - idioti a malé děti

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.

Poznámka: Pokud se rozhodnete neblokovat uživatele na základě IP adresy, doporučuji blokovat uživatele na základě registrace. Po zablokování registrace si samozřejmě i průměrný idiot zřídí registraci novou, takže je zapotřebí proces registrace ztížit - ať již vyplněním jedinečného emailu (na který přijde aktivační odkaz - v praxi to znamená pro idiota kromě registrace u Vás ještě registraci nového freemailu na seznamu) nebo zasláním aktivační PREMIUM SMS (například v ceně 3 Kč). Pamatujte však, že čím složitější registrace na Vaše forum bude, tím méně si na něm bude povídat i normálních lidí.

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.

Poznámka: Doporučuji před kontrolou přezdívky odstranit všechny mezery a převést vše na malá písmena. Pokud se budete jmenovat Veselý králíček, odstraňte vždy všechny mezery ze zadaného nicku a zkontrolujte jej oproti slovu veselýkrálíček.

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:

  •  omezit počet zpráv přijatých z jedné IP adresy za časovou jednotku (třeba více než 20 zpráv za minutu = smazání všech zpráv a ban)
  • zakázat poslání stejné zprávy během časové jednotky (třeba ignorovat zprávy, které již byly v minulých 5 minutách z dané IP poslány, popř. zakázat poslání dvou stejných zpráv po sobě)
  • omezit počet smajlíků (ať již stejných nebo různých) na rozumný počet
  • limitovat maximální počet stejných znaků za sebou (zejména je zapotřebí nahrazovat desítky vykřičníků za jeden vykřičník a podobně)
Perlička: V raných dobách Ujdeta jsme měli problémy s lidmi, kteří posílali nesmyslné zprávy typu gdfgsdgf. Naprogramoval jsem skript pro vyhledávání tzv. neplatných slov, který automaticky banoval všechny lidi, kteří vyplnili slovo obsahující více než 5 po sobě jdoucích souhlásek (takové slovo by nemělo v češtině existovat). Skript se krátkodobě osvědčil, v delším období však byly problémy i s jinak normálními lidmi, kteří občas "ujeli" a napsali slovo typu hurrrrrrá!!!.

Hrozba třetí - inteligentní a vzdělaní škodiči

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.

Komentáře k článku

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á :)

Přidat vlastní komentář:
Jméno:
E-mail:
Sledovat diskusi:
Web:
Kontrolní kód:

Komentáře jsou v prvé řadě určeny ke kladení dotazů k tématu, upozornění na chybu, rozšíření obsahu článku a vůbec ke zpětné reakci na obsah těchto stránek. Mé reakce jsou barevně odlišeny.

V současné době není umožněno vkládat HTML tagy - pokud vložíte HTML kód, bude převeden na entity. K Vašemu komentáři se do databáze uloží čas vložení a Vaše aktuální IP adresa (54.196.110.85). IP adresa se nebude zobrazovat čtenářům, nicméně v případě, že bude Váš odkaz shledán právně závadným, může být Vaše IP adresa předána příslušným státním orgánům. Emailové adresy jsou ochráněny před běžnými spam roboty.

© Marek Demčák 2007 - 2018
Všechna práva dle Autorského zákona (č. 121/2000 Sb.) vyhrazena.