Smitka development

Komentářový spam - bráníme se

Doba je zlá a pokud se uvolníte a poskytnete uživatelům svých stránek možnost interakce v podobě komentářů a podobně, dříve nebo později si vás najdou reklamní roboti, kteří vás budou zahlcovat komentáři s reklamou...
Na svých stránkách jsem pře 2 lety navrhl filtr komentářů pracující na principu váhovaného seznamu zakázaných slov - viagra, free, poker, ... - klasická slova vyskytující se v reklamách + nízce vážené http, href, [url - vychází z předpokladu, že v příspěvku bude velké množství odkazů, psaných v HTML nebo v BB kódech.
Na filtr jsem zapomněl a on tyto 2 roky pracoval a se 100% úspěšností odfiltroval několik stovek spamů. Nedávno se začaly objevovat různé diskuze o komentářovém spamu, vzpoměl jsem si na filtr a udělalo mi radost, že tak dobře funguje. Bohužel se četnost spamů zvyšovala a já jen čekal, kdy nadejde doba, kdy některé spamy začnou procházet - byly to spamy s náhodnými řetězci (zřejmě testovací) a krátké spamy s jednoduchým textem a odkazem typu: "Hi, check this: http...", samozřejmě takdo krátký spam nedokáž nasbírat dostatek bodů, aby byl odfiltrován.
Proto nastal čas k dalšímu řešení a nyní popíšu medody, které jsem použil:

Přejmenování souboru, který vkládá komentáře

Základní obrana, která na chvilku odstřihne boty, které váš web znají a vkládají komentáře přímo posláním na vkládací skript.

Doplnění políčka formuláře JavaScriptem

Vychází z předpokladu, že boti buď javascript nevykonávají, nebo přistupují přímo k odesílacímu skriptu. Přidám do formuláře další pole, které pak JS skryji a naplním ho hodnotou třeba 5 - a jako popisek pro uživatele, který JS nemá dáme "Kolik je 7-2?", naprostá většina uživatelů si této ochrany ani nevšimne a mnoho botů s ní bude mít velké problémy. Dobré je, že tento způsob také odstřihne boty, které již váš web znaji, protože přidá testování nového prvku formuláře, o kterém bot zatím nevěděl.

Nastrčení "profláklého" prvku

Ochrana, které může zmást nové boty. Do formuláře dáme nové políčko s lákavým názvem, třeba "nick", políčko skryji pomocí css, aby neobtěžovalo uživatele. Po vložení komentáře testuji zda je v tomto políčku nějaký text, pokud ano - jedná se o bota.

Nastrčení druhého submitu

Varianta předchozího způsobu. V do formuláře vložíme před opravdový submit ještě jeden, který opět skryjeme. Testujeme pak jakým submitem byl formulář odeslán. Tuto metodu uvádím jen pro doplnění, v mém řešení jsem ji nepoužil.

Filtr obsahu

Pokud příspěvek projde všemi pastmi, může jde buď o opravdového uživatele, nebo o velmi chytrého bota :-). Můžeme tedy doufat, že když už je tak chytrý, tak vložený příspěvek nebude jen pár slov. Proto jsem ještě pro jistotu na příspěvek aplikoval vážený filtr zakázaných slov, pokud příspěvek nasbírá dostatek bodů, jde o spam.


Existují další metody jako captcha, ale ty považuji za uživatelsky nepřívětivé.

Doufám, že tento článek trošku pomůže v boji s komentářovým spamem. Metody lze jistě ještě vylepšit, napadá mě třeba využití události onMouseMove, jejich potřebu však ukáže až čas.

[UPDATE 17.10.2008]

Po várce emailových dotazů přidávám některé odpovědi :-)

Jak použít filtr obsahu?
Můj filtr je založen na jednoduchém slovíku, který jsem sestavil, při zkoumání jiného - spamboty napadnutého - webu.
Slovník v aktuální podobě je si můžete prohlédnout
Případně přímo vyzkoušet

Navíc přikládám zjednodušený kód testu, který vezme data z poslaného formuláře a do proměnné $spam vloží číselnou hodnotu spamu. Z spam pak můžeme považovat příspěvky například nad 30 bodů. $slovnik=file("slovnik.txt"); $text=strtolower($_POST["text_komentare"]); $spam=0; for ($i=0;$i<sizeof($slovnik);$i++){ $filter=explode(',',$slovnik[$i]); $spam=$spam+(substr_count($text,$filter[0])*$filter[1]); }
Jak vygenerovat početní příklad?
Pro ověření můžeme zadat číslo staticky, ale je možné, že se časem provalí... pokud používáme sessions, tak může být vhodný způsob získání příkladu z proměnné PHPSESSID - $ses=$_REQUEST["PHPSESSID"]; echo (ord($ses[2])%10) + (ord($ses[6])%10); Z námi určených pozic v řezci získá dvě čísla k výpočtu, která jsou během relace stále stejná.

Jak je možné, že se na těchto stránkách, přes všechny triky objevily spamy?
Jednoduše, protože jsem popisované triky zapomněl zapnout a dál fungoval jen obsahový filtr :-)
pocitadlo spamu
linkuj.czjagg.czpošli na vybrali.sme.skdeliciousTopČlánky.cz
Nahoru HOME PC•Elektro Programování Blog Autor Lynt Speciální backlink: Šulislav
© 2006 Smitka development