Pokud patříte mezi provozovatele nějakého webového fóra a z nějakého důvodu nechcete nebo nemůžete použít různé metody typu CAPTCHA, ale problém s roboty spamujícími Vaše fórum máte, zkusíme se podívat na jeden nepříliš obvyklý způsob, jak vaše fórum ochránit.
Základem řešení je něco, čím se odlišuje skutečný člověk s prohlížečem od spamovacího robota a tohoto rozdílu pak patřičně využít.
Klíčová otázka tedy je, jak takovéto rozdíly najít. Nejvhodnější způsob tedy bude nechat si vypisovat informace, které posílá prohlížeč serveru - hlavičky. Můžeme to udělat například tak, že vložíme následující kód do souboru index.php ve Vaší šabloně a tím si necháme potřebné informace zapisovat do logu (tento postup můžeme použít zejména tehdy, pokud je fórum již pravidelně napadáno):
<?php $fh=fopen($mosConfig_absolute_path.'/log.txt',"a"); $aHeaders=getallheaders(); fwrite($fh,"================================================\n"); fwrite($fh,date("r")."\n"); fwrite($fh,"http://".$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"]."\n"); foreach ($aHeaders as $key => $value) { fwrite($fh,"$key=$value\n"); } fclose($fh); ?>
Když máme již v logu potřebné informace jak od robotů tak od reálných uživatelů, můžeme s tím pracovat. Uvedu zde několik příkladů, které by se mohly vyskytnout?
- robot nepošle informace o prohlížeci, narozdíl od běžných návštěvníků, kteří posílají jméno prohlížeče vždy
- robot přistupuje vždy z jedné IP adresy
- robot neposílá žádné cookies (předpokládáme, že dnes již nikdo cookies ve svém prohlížeči nevypíná)
- robot neposílá jiné hlavičky, které prohlížeče posílají (Accept-Charset, Accept-Encoding, Accept-Language, ...) nebo tyto hlavičky mohou mít v případě robotů nějakou zvláštnost
Dále si jako modelový příklad představíme variantu, že roboti neposílají cookies, zatímco běžný návštěvník webu v okamžiku odeslání příspěvku ano. Konkrétní aplikaci tohoto řešení si ukážeme na komponentě MaxComment (a to z toho prostého důvodu, že jsem to řešil a mám tedy vyzkoušené, že to funguje).
<?php // Nacteme hlavicky poslane prohlizecem $aHeaders=getallheaders(); if ( !$aHeaders['Cookie'] // pokud prohlizec neposlal zadne Cookie && strpos($_SERVER["REQUEST_URI"], 'com_maxcomment') // a pokud URL obsahuje 'com_maxcomment' && strpos($_SERVER["REQUEST_URI"], 'savecomment') // a pokud URL obsahuje 'savecomment' ) { // odmitneme pristup die( 'Access denied.' ); } ?>
V okamžiku, kdy se ukládá příspěvek do databáze, přistupuje prohlížeč přes URL, které obsahuje mj řetězce "com_maxcomment" a "savecomment" a toho využijeme.
Jednotlivé podmínky se samozřejmě mohou lišit dle způsobu použití. U některých typů fór bude zřejmě potřeba zjištění momentálního stavu ne přes $_SERVER["REQUEST_URI"] ale přes pole $_POST
Zbývá tedy tento skript umístit na vhodné místo. Nabízejí se 2 základní možnosti, každá má svá pro i proti.
- soubor index.php z Vaší šablony. Výhodu to tu, že v případě upgradu na novější verzi Joomly, nebude potřeba nic doplňovat a upravovat. Může se ale stát, že v tomto případě, bude více vytížen váš server, v tomto případě budou také veškeré odmítnuté přístupy zaneseny do statistik, pokud je v Joomle používáte
- kořenový soubor index.php (někde na začátku). Je potřeba pamatovat na to, že jde o zásah do zdrojového kódu Joomly a nesete tím všechna rizika s tím spojená.
Na závěr je třeba poznamenat, že žádná metoda není samospasitelná a i uvedený příklad má svoje omezení. Je možné že přijdete na další způsoby využití nebo naopak odhalíte nějaké slabiny - v tom případě jsou pod článkem k dispozici komentáře, tak se také můžete rozepsat.
MokrOuš