optimized for: Mozilla Firefox 5.0, screen: 800*600 +, charset: iso-8859-2

Boj se Spamem aneb www.vetrne-mlyny.com

tomash - 15. 10. 2006

Asi každý při tvorbě svých stránek dojde k okamžiku, kdy se rozhodne na ně umístit návštěvní knihu, aby mu návštěvníci mohli svými vzkazy pozvednout sebevědomí, pomoci něco zkritizovat, mluvit úplně z cesty, prostě vyvolat dojem, že jeho stránky někdo čte. A už do ní přispívá sám nebo jeho okolí pod pohružkou fyzického násilí, či čistě náhodní návštěvnící, čas od času se v ní chtě nechtě objeví nějaký ten Spam (aka nevyžádaná reklama, svinstvo). Horší je, když se adresa návštěvní knihy nebo komentářů k článku, prostě jakákoliv diskuze, dostane do trvalého hledáčku spam robota a ten jí začne bombardovat desítkami spamu. Chudák spammer si zřejmě neuvědomuje, že ne každý ocení nabídku viagry, cialisu, xanaxu, pheterminu (půlku z těch slov jsem v životě neslyšel a dozvěděl sem se je poprvé až ze spamu). Když už byly zaměřeny i moje stránky a ruční mazání spamu se stávalo neúnosné, rozhodl jsem se se spamem bojovat všemi prostředky.

Nejprve je třeba si uvědomit, jak takový spammer funguje. Bohužel jsem dosud na žádné sympozium spammerů pozván nebyl, a tak nezbývá než věřit dohadům a doměnkám. Dnešní spammer už těžko dnem i nocí datluje do klávesnice a od počítače vstává jen pro kafe. Spammer vyhledává aktivní odkazy na různé diskuze a ty dosazuje do databáze. Posléze spamovací robot prochází diskuze tj. vyplňuje jednotlivá pole formuláře "poslepu" předem daným textem. A díky tomu je šance se mu bránit.

Opište daný text aneb CAPTCHA veryfying
První lest na spammery, kterou jsem vyzkoušel, byla tzv. CAPTCHA. Určitě už jste se někde setkali s pokynem "opište prosím text na obrázku". Jde o náhodně vygenerovaná písmena, či číselnou řadu, jejichž hodnota se následně kontroluje s vyplněným textem. Celý příklad si můžete stáhnout zde. V souboru visual-captcha.php se vytvoří obrázek (jehož pozadí můžeme uložit v images/captcha.jpg) v souboru php-captcha.inc.php se do něj nageneruje kód, který se zašifruje md5, a pro nás je nejdůležitější soubor kontrola.php, který si můžeme libovolně upravit a provádět s ním kontrolu. Je třeba podotknout, že CAPTCHA funguvala pouze několik týdnů, než se jí roboti naučili obcházet. Lze ji ale použít jako součást komplexní obrany proti spamu a věřím, že se díky ní počet spamů alespoň sníží.

Filtrace slov
Buy cialis, buy viagra, buy ..... Spammeři nám opravdu nabízejí všelicos a naštěstí se rádi donekonečna opakují. Následující metoda sníží lehce svobodu návštěvníků serveru, ale věřím, že minimum z nich bude chtít diskutovat o viagře a pokud ano, tak se to naučí obejít. Stačí jednoduchý skript.

<textarea name="zprava" rows="4" cols="30" /></textarea>
... odeslání hodnot ....
<?
$f=0;
$ToFilter=$zprava;

$Foul = @file("foul.txt");
foreach ($Foul as $FoulWord)
{
$FoulWord = trim($FoulWord);
if (preg_match("/".$FoulWord."/i", $ToFilter)):
$f=$f+1;
else:
$f=$f;
endif;
}
if ($f>0):
echo "<b>Je nám líto, ale Vámi vytvořená zpráva obsahuje některý ze zakázaných výrazů
(<a href=\"foul.txt\">ZDE</a>). Omlouváme se všem slušným pisatelům.</b><br /><br />";
else:
?>
pokračujeme v ukládání dat....
Princip je jednoduchý: načteme text vyplňený uživatelem v poli zprava a porovnáme jednotlivé řetězce s řetězci zadanými v souboru foul.txt. Pokud se jeden nebo více řetězců shoduje s řetězci v souboru foul.txt, má spammer smůlu, jeho zpráva se neuloží. Pokud je vyplní běžný uživatel serveru, bude na to upozorněn i se seznamem "zakázaných" slov a má šanci to obejít (pokud mě stůj co stůj musí informovat o viagře, tak vyplní prostě v-i-a-g-r-a a má vystaráno). Soubor foul.txt může každý vyplnit dle vlastního uvážení, k seznamu slov jsem došel vyhledáváním nejčastěji nabízených produktů. Filtrace slov v příspěvcích je dle mých zkušeností velmi učínný štít proti hromadě spamu.

blind unfriendly
Další nápad obrany proti spamu využívá toho, že roboti vyplňují formuláře poslepu. Past je opět jednoduchá. Nastražil jsem na ně dvě pole formuláře s lákavými názvy "name" a "message". Těmto polím jsem pomocí css dal "neviditelnost" (size=1 style="border:0;backround:stejna barva jako pozadi stranky"). Pokud je šikovně umístíte, běžný uživatel si jich stěží všimne a šance, že do nich klikne, je velmi malá. Pokud tak ovšem omylem učiní a něco vyplní bude zase upozorněn, že vyplnil nesprávná pole.

<input type="text" size="1" name="message" style="border:0px;background:#EEEFD3;" /> <input type="text" size="1" name="name" style="border:0px;background:#EEEFD3;" />
...odeslání formuláře...
<?
if (($name!="") or ($message!="")):

echo "vyplnili jste nesprávná pole";

else:
?>
... pokračujeme v ukládání dat...
Metoda je velmi jednoduchá, avšak překvapivě účinná.

Na závěr bych podoktnul, že ani přes tři silné vrstvy ochrany proti spamu si nějaká ta nabídka hry v kasinu cestičku vždycky najde. Případně se často objevují i prázdné formuláře (vyplněné zřejmě netisknutelnými znaky - protože mám kontrolu vyplnění polí formuláře), které mají asi za úkol zkontrolovat existenci a funkčnost potencionálního cíle. Další ostré střely už mají cestu dost stíženou. Daly by se použít i jiné formy ochrany proti spamu například banování IP adres - to jsem ale ani nezkoušel, protože pochybuji o tom, že by všechen spam mířil z jedné adresy. Pokud máte nějaké zajímavé nápady nebo výhrady, tak si je určitě rád přečtu.