Bots über PHP Funktion erkennen

Hin und wieder ist es nötig zu prüfen, ob der aktuelle Besucher der Seite ein Bot ist. Z.B. dann wenn man einen kostenpflichtigen Webservice nutzt und verhindern möchte, dass Suchmaschinen-Bots und -Crawler die Rechnung in die Höhe treiben. Das geht recht zuverlässig über den User-Agent-String.

Wer noch nicht weiß, wie die User-Agent-Strings zu dem wurden, was sie heute sind, dem empfehle ich diesen Artikel: http://webaim.org/blog/user-agent-string-history/

Am besten nutzt man ein Whitelisting, statt einem Blacklisting. Also ein Prüfen des User-Agents, ob es sich bei dem Benutzer um einen Menschen handelt.

function MYMODULE_is_not_bot($user_agent = NULL) {

	if(is_null($user_agent)) $user_agent = $_SERVER['HTTP_USER_AGENT'];
	$ROBOT_USER_AGENTS= array (
	  'Mozilla',
	  'Chrome',
	  'Safari',
	  'Opera',
	);
	
	$returnval = FALSE;
	foreach($ROBOT_USER_AGENTS as $needle) {
		$pos = stripos($user_agent, $needle);
		if ($pos !== false) {
			$returnval = TRUE;
		}
	}
	return $returnval;
}

Aber es geht natürlich auch über Blacklisting. Hier ist zu beachten, dass man die Liste an Stichwörtern für die Bot-Erkennung aktuell hält. Das ist eine Sisyphusarbeit, aber wer sie nicht scheut, kann es z.B. so machen:

function MYMODULE_is_bot($user_agent = NULL) {

	if(is_null($user_agent)) $user_agent = $_SERVER['HTTP_USER_AGENT'];
	$ROBOT_USER_AGENTS= array (
	'check_http',
	'nagios',
	'slurp',          
	'archive',
	'crawl',
	'bot',
	'spider',
	'search',
	'find',
	'rank',
	'java', 
	'wget',
	'curl',
	'Commons-HttpClient',
	'Python-urllib',
	'libwww',
	'httpunit',
	'nutch',
	'teoma', 
	'webmon',
	'httrack',
	'convera',
	'biglotron',
	'grub.org',
	'speedy',
	'fluffy',
	'bibnum.bnf',
	'findlink',
	'panscient',
	'IOI',
	'ips-agent',
	'yanga',
	'yandex',
	'Voyager',
	'CyberPatrol',
	'page2rss',
	'linkdex',
	'ezooms',
	'mail.ru',
	'heritrix',
	'Aboundex',
	'summify',
	'facebookexternalhit',
	'yeti',
	'RetrevoPageAnalyzer',
	'sogou',
	'wotbox',
	'ichiro',
	'drupact',
	'coccoc',
	'integromedb',
	'siteexplorer.info',
	'proximic',
	'changedetection',
	'ZmEu',
	'Novalnet',
	'COMODO',
	'Drupal',
	'facebook',
	'analytics',
	'PayPal',
	'revolt',
	);
	
	$returnval = FALSE;
	foreach($ROBOT_USER_AGENTS as $needle) {
		$pos = stripos($user_agent, $needle);
		if ($pos !== false) {
			$returnval = TRUE;
		}
	}
	return $returnval;
}

 

Kommentare

Die angegebene Whitelist funktioniert nicht, da viele Robots auch als "Mozilla" unterwegs sind, darunter Google und Bing:Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm).Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) In diesem Skript werde diese Bots als Menschen gezählt