Články
Spíte dobře? Připravili jsme pro Vás články, které Vám nedají spát.Ochrana formulářů proti spamu
1. 11. 2006 | Martin Cajthaml
Jedním ze základních problémů začínajícího webového vývojáře je ochrana formulářů. Když už dokáže data validovat, zjistí, že mu formuláře neustále vyplňují spam-roboti. Na odfiltrování takových dat je třeba určit předpoklady, které roboty jednoznačně odliší od běžného uživatele. V tomto článku se pokusím shrnout podstatné možnosti ochrany formulářů s několika praktickými ukázkami.
Martin Cajthaml
IT ManagerKe každé metodě ochrany formuláře si uvedeme odkaz na ukázkový formulář, kde je implementovaná daná technika v PHP. Tento formulář po odeslání vypíše buď "Robot", nebo "Uživatel" v závislosti na tom, kým byl pravděpodobně odeslán. Formuláře budou jednoduché s jediným textovým vstupem a nebudou pro jednoduchost jinak validovány na obsah dat.
První věc, kterou pravděpodobně udělá každý vývojář při implementaci formuláře, je validace vyplněných dat. Tuto část beru jako prerekvizitu, takže ji zde nebudu popisovat. Je na každém vývojáři, jak si ji udělá a také si ji často dělá každý po svém. Nyní jsme tedy ve stavu, kdy máme formulář, který se validuje na straně serveru. Pořád nám ale roboti vyplňují nesmyslné údaje (většinou e-mailové nebo webové adresy, texty e-mailů, apod.). Co s tím dál?
Kontrola refereru
Jedna z primitivních kontrol vychází z jednoduché myšlenky. Uživatele, který vyplní a odešle formulář přes webový prohlížeč, můžeme poznat podle HTTP hlavičky Referer. Tu předávají prohlížeče automaticky a je v ní uložena adresa stránky, ze které uživatel přišel na stránku aktuální. Při zpracování pak stačí zkontrolovat tuto hodnotu a musí se shodovat s adresou stránky s formulářem. Naneštěstí se většina robotů s tímto vypořádala a hlavičku automaticky doplňují.
Kontrola času
Další jednoduchá kontrola využívá toho, že robot je většinou rychlejší než člověk. Stačí si někam uložit aktuální čas zobrazení stránky s formulářem a pak porovnat s časem v obslužném skriptu. Člověku vetšinou trvá nějakou chvíli, než stránku s formulářem přečte a vyplní. Robota lze tedy odlišit podle toho, že formulář odešle příliš rychle. V ukázkovém příkladu jsem nastavil limit na 0,5 sekundy. Nevýhodou je opět přizpůsobivost robotů, takže některé už čekají určitý čas před odesláním hodnot.
Kontrola obrázkem
Není tomu zas tak dávno, kdy se rozšířil systém nazvaný CAPTCHA. Určitě ho všichni znáte. Jedná se o obrázek, na kterém je napsán nějaký kód a uživatel ho musí opsat. Přiznám se, že k této metodě jsem čím dál skeptičtější. Byli vytvořeny speciální čtečky na takové kódy a co je ještě pikantnější, dokážou přečíst i pro člověka téměř nečitelné texty. Navíc tento systém porušuje pravidla přístupnosti webu. Proto doporučuji tuto ochranu nepoužívat, pokud nechcete rozzlobit uživatele.
Kontrola logickou otázkou
Prakticky nejlepším řešením odolném i do budoucna je systém kladení nějaké jednoduché otázky, na kterou zná každý člověk odpověď. Jedná se například o "1 + 1 = ?" (2) nebo "Kočka a ?" (pes) nebo "Hlavní město ČR?" (Praha). Takovou otázku je pro robota téměř nemožné vyřešit. Bohužel je to pro některé uživatele příliš obtěžující.
Kontrola javascriptem
Tato metoda je vlastně jen malou ukázkou velké škály ochran. Využívá toho, že roboti neumějí nějakou technologii, kterou podporuje běžný prohlížeč - v tomto případě javascript. Do formuláře se pak přidá javascriptem jedno skryté pole. Jeho hodnota se pak kontroluje při obsluze. Pro uživatele bez javascriptu se ono pole zobrazí normálně, ale s popiskem vysvětlujícím, co mají vyplnit. Do doby, než se objeví roboti, kteří rozumí javascriptu, je tato metoda v podstatě ideální. Drtivou většinu uživatelů neobtěžuje (mají zapnutý javascript), ti ostatní pouze vyplní o jedno pole navíc. Tento způsob je v současnosti jedním z nejúčinnějších.
Další druhy kontrol
Všechny kontroly se snaží o jedno: zmást robota, aby formulář vyplnil špatně nebo nevyplnil vůbec. Trochu to připomíná boj kočky s myší. Každý čeká, co provede ten druhý, aby se tomu mohl přizpůsobit. Proto vznikají stále nové a nové metody na odfiltrování robotů. Jsou to například tyto:
| Metoda | Vlastnost robotů, kterou metoda využívá |
| Vložení dalšího submit tlačítka před skutečné | Roboti odesílají formulář všemi submit tlačítky, které naleznou. Tak je možno je odhalit. |
| Odesílání pomocí Flashe, celý formulář ve Flashi, apod. | Roboti neumí interpretovat Flash |
| Přidání jednoho skrytého pole a testování, zda zůstalo prázdné. Zaslal Martin Vataha. | Roboti většinou vyplňují všechny položky formuláře. |
Tabulku budu postupně doplňovat. Nápady mi můžete psát ve formuláři dole pod článkem.
Závěr
Na závěr je třeba zmínit, že některé formuláře je vhodné vybavit trochu specifickou rozšířenou ochranu. Formuláře, které po odeslání posílají něco na e-mail, je třeba chránit před speciálními roboty. Ty vkládají do všech polí zdrojový text e-mailu včetně hlaviček. Při jednoduchém zpracování se pak e-mail rozešle na adresy specifikované útočníkem. Podobně funguje tzv. komentářový spam, kdy jde autorovi hlavně o umístění odkazu na jeho stránky do co nejvíce diskuzí. V těchto případech je třeba hlídat příspěvky s odkazy nebo náhradními značkami ([url...).
Snažil jsem se shrnout různé druhy ochrany formulářů před spamovými roboty. O tomto tématu by šlo napsat minimálně celou knihu, ale doufám, že alespoň takový úvod přijde vhod a poskytne pár dobrých rad. V současnosti osobně považuji za nejvhodnější kombinaci kontrolu referery, kontroly času a kontroly javascriptem.
Související články
Chcete uveřejnit náš článek?
Máte zájem některý z našich článků publikovat ve Vašem časopise, webu či kdekoliv jinde? Neváhejte nás kontaktovat!
Zažádat o svolení

Vaše názory