Letzte Kommentare

PlayJaps: Ïðèâåò Æäåì íà ñòîïî÷êó :) Êëàññíî! KAPOW…

Klaus: Guten Tag, ich habe Ihre Seite über die Google-Suche gefunden, weil…

Michael: Hallo Josef, Wo du die gezeigte Funktion hinein kopierst ist ziemlich…

Josef: Guten Tag! Ich habe mich mit der PHP-Template-Thematik noch nie beschäftigt.…

L3o: Danke, das rettet mir den Tag, ich schreibe nämlich im Moment gerade selbst…

Zum mitnehmen

Für Programmierer:

Für Anwender:

Kommentarspam verhindern mit PHP

Tags: php, spam 7 Kommentare

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/

Kommentare

Pablo am 28. Juni 2006, 13:50 Uhr

Bitte das #comments aus meiner URI wech ;) Wenn, dann #post-290 :P

Michael am 28. Juni 2006, 15:18 Uhr

Hi Pablo,

jaja copy & paste war schuld *g*

Clemens Lang am 04. November 2006, 15:44 Uhr

Danke für dieses Script... ich hoffe, dass das endlich mein Spam Problem löst!

Sam am 03. Dezember 2006, 13:33 Uhr

Danke für das PHP Script.
Ich habe um die 20 Kunden, die sich vor Spam kaum noch retten können.
Das Script schließt wenigstens die Spam Attacken.

Danke Sam

Dean am 15. Januar 2007, 13:44 Uhr

Hy,
vielen Dank für das Script. Wollte in meinem neuen Forum ein Gästebuch einbauen und es wird da zur Anwendung kommen.
Ich hoffe es hilft ein wenig"
Thanks und Bis dann
Dean

ExLabordiner am 12. April 2007, 16:03 Uhr

Please, give me contact address (email or msn) of this site administrator...
Thanks!

Michael am 12. April 2007, 16:23 Uhr

Hello,

you'll find my email address on the contact page.

Kommentar schreiben

  • Erlaubte HTML Tags: <a> <code> <em> <strong> <small> <ul> <ol> <li> <blockquote>
  • Zeilen und Absätze werden automatisch formatiert.
  • Web und E-Mail Adressen werden automatisch umgewandelt.