Viele Blogger klagen zur Zeit über Spam in ihren Kommentaren. Es gibt allerdings einige einfache Tricks um sich vor Spam-Bots zu schützen und sich so unnötige Arbeit mit dem Löschen solcher Kommentare zu ersparen.
Meine kleine PHP Funktion arbeitet mit einem Punkte-System. So kann jeder selber festlegen ab wann der Post als Spam erkannt werden soll.
Überprüft werden folgende Faktoren:
- Ob der Benutzer von einer Seite der gleichen Domain weitergeleitet wurde (Referer).
- Wie lange gebraucht wurde um das Formular auszufüllen.
- Ob die IP Adresse überein stimmt.
- Und ob der im Hintergrund übermittelte Hash stimmt.
Vorbereiten des Formulars
Als erstes muss das Kommentar-Formular mit zwei zusätzlichen Formularfeldern ausgestattet werden. So z.B.:
<?php
$rand_chr = '2/dx§&K40xaw1=4?d';
$query = time() .'_'. base64_encode($_SERVER['REMOTE_ADDR']);
$hash = md5($query . $rand_chr);
echo '<input name="as_query" type="hidden" value="'. $query .'" />';
echo '<input name="as_hash" type="hidden" value="'. $hash .'" />';
?>
Hier wird also die Zeit übermittelt (wann das Formular generiert wurde), die IP-Adresse (base64 enkodiert) und ein Hash davon, damit die Angaben danach auf ihre Richtigkeit überprüft werden können. Dem MD5 Hash wird noch eine Zeichenkette angehängt, sonst wär es wieder einfach für Spam-Bots. Diese Zeichenkette solltet ihr selber zufällig wählen.
Überprüfen der Formular-Daten
Jetzt der wichtigste Teil des Scripts:
<?php
function is_spam($max_points = 5) {
global $rand_chr; // Requires the random string from before.
$points = 0;
if(isset($_POST['as_query'], $_POST['as_hash']) && strpos($_POST['as_query'], '_')) {
// Process submitted data
list($timestamp, $ip) = explode('_', $_POST['as_query']);
// Check for same hash
if($_POST['as_hash'] != md5($_POST['as_query'] . $rand_chr)) {
$points += 6;
}
// Check for same IP
if(base64_decode($ip) != $_SERVER['REMOTE_ADDR']) {
$points += 4;
}
// Check on timestamp
if(time() - $timestamp <= 3) {
$points += 4;
}
elseif(time() - $timestamp <= 6) {
$points += 3;
}
// Check for valid referer
if(!strpos(strtolower($_SERVER['HTTP_REFERER']), strtolower($_SERVER['HTTP_HOST']))) {
$points += 3;
}
// Is it spam?
if($points <= $max_points) {
return FALSE; // No spam
}
else {
return TRUE; // spam :-(
}
}
else {
// No form data submitted. Handle as spam.
return TRUE;
}
}
?>
Mit dieser Funktion werden die Daten überprüft und Punkte vergeben. Ich denke mehr brauche ich dazu nicht sagen/schreiben, da alles auskommentiert ist, aber bei Fragen bitte die Kommentare nutzen.
Danach kann man bequem überprüfen ob der Post als Spam erkannt wurde oder nicht:
<?php
if(is_spam()) {
die('don't spam my blog');
}
else {
// sql INSERT or whatever you want :)
}
?>
Das ganze kann man natürlich nicht nur mit Kommentarformularen benutzen sondern eigentlich mit jedem Formular. Unabhängig davon gibt es auch andere Methoden zur Spam-Bekämpfung. So kann man z.B. mit htaccess ganze IP Bereiche aussperren, was allerdings auch manchmal auch echte User aussperrt. Hier noch ein paar interessante Links dazu:
http://blog.patrickkempf.de/archives/2006/06/03/spam-attacke-geht-weiter/
http://unknowngenius.com/blog/wordpress/spam-karma/
http://www.basicthinking.de/blog/2006/05/22/spam-branche-mit-zukunft/

Pablo am 28. Juni 2006, 13:50 Uhr
Bitte das #comments aus meiner URI wech ;) Wenn, dann #post-290 :P