Ochrana phpBB proti spamerským robotům
Více méně z nutnosti již nějaký čas spravuji jedno webové fórum postavené na phpBB. Jedná se o celkem pěkný systém pro snadnou tvoru webového fóra bez nutnosti jakýchkoliv programátorských dovedností. Jelikož je hojně využíváno, je též často zneužíváno k různým aktivitám, které správci neradi vidí.
Zatímco proti hackování fóra se můžete bránit pravidelnou aktualizací, proti různým spamerským robotům je to již těžší. Spamerský robot si můžete představit jako jakýsi automat, který šmejdí po webu a hledá kde by prováděl svoji nekalou činnost. V případě phpBB se jedná o dva typy robotů. Před nedávnem jsem se jim trochu podíval na zoubek, protože mě řešení jejich následků jednoduše přestalo bavit.
První, budeme je nazývat třeba registrační roboti, nedělají nic jiného, než že si zaregistrují nějaký nesmyslný nick a tím jejich aktivita končí. Poznáte je snadno. Nicky takových uživatelských kont mají tvar nicku + nějaké to číslo – např. charlie1984. Dále mají většinou nastaven jako výchozí jazyk angličtinu či ruštinu. Hlavním ukazatelem je ale "uživatelova domovská stránka", která obsahuje odkaz na nějakou "super hyper xxx site".
Proč to roboti dělají? Důvod je vcelku jednoduchý. Fulltextové vyhledávače, jako například Google, procházejí jednotlivé webové stránky a indexují je. Výsledná kvalita zaindexované stránky je též mimo jiné počítána i na základě počtu odkazů, které na ni vedou, což má být jakýsi ukazatel kvality. Webové fórum postavené na phpBB je samozřejmě indexováno také, čehož roboti využívají a registrují nesmyslná konta. Obrana proti tomuto typu spamu je snadná – v nastavení fóra zapnete volbu Povolit visuální ověřování, čímž zajistíte, že pro dokončení registrace bude muset uživatel přečíst znaky z náhodně generovaného obrázku. To uživatel zvládne, robot nikoliv.
Druhý typ robotů se na nic neptá. Prostě rovnou do náhodné sekce fóra přidá příspěvek plný odkazů. Obranou může být povinná registrace, ale existují fóra, která se zabývají podporou nějakého produktu a tam je nutnost registrace nežádoucí. Proč by se měl uživatel, který chce položit jen jeden dotaz, registrovat? Proč by měl doplácet na chování automatických robotů? Tak přesně tento problém jsem řešil a řešení bylo vcelku snadné. Posuďte sami.
Vše, co potřebujete, je být chytřejší jak robot. Pokud ve fóru uživatel zadává příspěvek, jde přes formulář, kam jej zadá. Po odeslání se data z formuláře odešlou dalšímu skriptu k ověření jejich platnosti a následně jsou publikována. Robot na to jde jinak. Nějaký formulář? Nepotřebuje a pošle data přímo skriptu na zpracování. Toho lze velmi dobře využít.
V šabloně v cestě /templates/(jméno_vašeho_motivu)/posting_body.tpl přidejte jako součást vstupního formuláře další prvek, který bude skrytý a dejte mu nějakou výchozí hodnotu. V našem případě "test4321".
<input type="hidden" name="kontrola" value="test4321" />
Hodnotu tohoto formulářového prvku je po odeslání skriptem potřeba získat. V souboru posting.php vyhledejte řádek:
$message = ( !empty($HTTP_POST_VARS['message']) ) ?
$HTTP_POST_VARS['message'] : ”;
Ten získává do proměnné $message text z hlavního pole formuláře. Pod tento řádek přidejte:
$kontrola = ( !empty($HTTP_POST_VARS['kontrola']) ) ?
$HTTP_POST_VARS['kontrola'] : ”;
Tím získáte obsah vašeho skrytého prvku z formuláře. Kousek za tímto kódem naleznete volání funkce prepare_post, do níž zadejte proměnnou $kontrola jako další vstupní parametr (nejlépe jako poslední). Nyní si otevřete soubor /includes/functions_post.php, v něm vyhledejte hlavičku uvedené funkce a přidejte též jako poslední vstup proměnnou &$kontrola.
Nyní již zbývá jen odstavit robota. V tuto chvíli, pokud příspěvek přišel od fyzického uživatele, má proměnná $kontrola výchozí hodnotu z formuláře. Pokud se jedná o robota, nemá ji a postačí jakékoliv chybové hlášení přidat do proměnné $error_msg. Může to vypadat třeba následujícím způsobem.
if ($kontrola != "test4321") {
$error_msg .= 'Pokud vidíte tuto zprávu, pak nastala
chyba a informujte prosím správce fóra.';
}
Příspěvek nebude přidán a formulář se zobrazí znovu, aby uživatel zadal opravu, ale s tím si již robot neporadí. Pro kontrolu doporučuji nechat si zasílat všechny příspěvky, které neprojdou touto podmínku, na e-mail. Pro kontrolu, co kdyby.
Jaká je úspěšnost výše uvedeného způsobu? Z mého pozorování zatím 100%. Nezaznamenal jsem žádný spam od automatického robota, ani chybu, kdy by fyzický uživatel díky této ochraně nemohl odeslat svůj příspěvek. A o to přeci šlo, ne?
Aktualizace
Vše je jen otázkou času a jak jsem zjistil, objevili se roboti, kteří umí projít i výše uvedenou ochranu. Nejspíš dokáží vyplnit formulář a odeslat jej. Řešení tohoto problému může být dvojí:
- Přejmenovat textarea, kam uživatel vkládá příspěvek. Prostě změnit hodnotu "name" (+ samozřejmě i v ověřovací části). Pokud to nezabere, vložit před ní další textarea s popiskem, že se sem nemá nic vpisovat a celé to skrýt pomocí CSS. Samozřejmě správnou textarea přejmenovat a tu fiktivní pojmenovat tak, jak se pole na zadání zprávy standardně jmenuje (atribut name). To by mělo robota zmást.
- Pro anonymní přidávání příspěvků přidat combobox (výběrový seznam) s popisným textem "Publikovat příspěvek?" a možnostmi "ano" či "ne" s tím, že hodnota "ne" bude jako výchozí a uživatel bude muset zvolit hodnotu "ano". Řešení nikterak složité, ale robot si s ním neporadí.