Přihlásit se

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š