Správná CAPTCHA jako boj proti spamu

  • 31.8.2009
  • Tomáš Hojgr

Captcha je (a co jsem hledal tak snad i jediná) vhodná technika, která dokáže odfiltrovat uživatele od automatického robota při odesílání formulářů v internetových aplikacích. Captcha se na webu liší svým zobrazením, někdy se jedná o obrázek, o zvukovou nahrávku, či otázku, na kterou je nutno odpovědět.

Standardně ve svých aplikacích používám jednoduchou obrázkovou Captchu, u které jsem předpokládal, že je proti robotům neprolomitelná. Můj zjevný omyl se projevil před několika dny, kde se najednou na určitém webu v diskuzi začaly objevovat příspěvky s odkazy na „hanbaté“ stránky. Samozřejmě vím, že se spamoví roboti snaží různými technikami Captchu obejít, ovšem netušil jsem, že se tak budou snažit u okrajových webů, kde je přístupnost nějakých pár set lidí denně.

Zkusím Vám tedy letmo popsat, jak jsem se Spamem bojoval a nakonec i uspěl. Snad Vám to pomůže při Vašich projektech a již nebudete zbytečně zkoušet kousky, které jsem zkoušel já.

Jaké metody jsem již vyzkoušel

Jak už jsem psal výše, netušil jsem, že by se spamový robot snažil prolomit Captchu na webech s přístupností do jednoho tisíce lidí denně. Proto, když začaly chodit spamové zprávy do diskuze na jednom webu, jsem si nemohl připustit, že je to zrovna nevhodnou obrázkovou Captchou. Na tomto webu byla implementovaná CAPTCHA, která za pomocí JavaScriptu odstraňovala nutnost uživatele vkládat požadovaný kód (psal jsem o tom v článku Používejte geniální CAPTCHA techniku), proto jsem si nejprve myslel, že daný robot umí JavaScript a tím pádem se vždy do políčka pro Captcha doplní daný kód.

Trošku jsem proto upravil skript, který nyní čekal 10 sekund před vyplněním Captcha kódu do políčka. Vycházel jsem z toho, že by robota nenapadlo čekat nějakou dobu na odeslání daného formuláře. I když se zdála úvaha správná, toto opatření samozřejmě nepomohlo a Spam se i nadále objevoval ve velkém množství.

V tento moment jsem si již myslel, že „geniální CAPTCHA pomocí JavaScriptu“ je neúčinná a proto jsem JavaScriptovou funkcionalitu z webu smazal, takže tam zůstala standardní, viditelná, obrázková CAPTCHA s nutností uživatele vyplnit požadovaný kód.

Správné řešení

Ovšem když se i třetí den objevily odkazy na „hezké holky“, má třetí a konečně správná taktika pro boj se SPAMem byla nakonec úspěšná. A to aktualizace CAPTCHA, respektive aktualizace kódu pro generování CAPTCHA obrázku, který ve výsledku vypadal pro člověka méně čitelný, přesto proti robotům velmi úspěšný. Když jsem ještě k tomu přidal JavaScriptovou funkcionalitu, dostal jsem se znovu tam, kde jsem chtěl:

"Nyní neotravuji uživatele vyplňováním CAPTCHA kódu do políčka a zároveň je daná ochrana (tedy prozatím) úspěšná i před útokem robotů"

Při tomto boji se SPAMem jsem se naučil pár věcí:

  1. Žádná ochrana proti SPAMu není stoprocentní a její procentní úspěšnost při častém používání velice rychle klesá k nule.
  2. Když už se někdo protlačil přes ochranu, vždy aktualizuj jádro problému, v tomto případě obrázek CAPTCHA

A rada na závěr

I když se Vám jako programátorovi jeví Vaše CAPTCHA jako dokonalá barikáda před útokem SPAMů, vždy ji po nějakém čase aktualizujte, neboť SPAMoví roboti „nikdy nespí“.