Kommentarspam verhindern ohne Captcha

21.12.2009, 21:28

Spam ist ein Problem eines jeden Bloggers oder Gästebuchbetreibers. Doch wie verhindert man Spameinträge ohne dass der normale menschliche Benutzer etwas davon mitbekommt? Barrierefrei sollte es natürlich auch gleich sein.
Captchas und andere Kontrollfragen fallen somit aus der Liste der Möglichkeiten. Doch es gibt weitere Methoden, Spambots unschädlich zu machen. Zu den bekannten gehört natürlich der Keyword-Filter, also wenn bestimmte unerwünschte Wörter oder andere Zeichenketten im Beitrag vorkommen, wird der Text als Spam eingestuft und entsprechend weiterverarbeitet. Allerdings wirkt dies nicht immer und es gibt Situationen, in denen sich diese Methode nicht anwenden lässt, beispielsweise wenn das Thema von Spam selbst handelt oder wenn mit HTML-Tutorials hantiert wird, wodurch man Spam nicht durch eventuell vorhandene HTML-Links aushebeln lässt.
Natürlich kann man als Spam eingestufte Beiträge von Hand noch nachkontrollieren, doch dies ist oft mit viel Aufwand verbunden.

Es existieren jedoch noch weitere Tricks, Spambots zu erkennen. Eine Möglichkeit ist das Einfügen eines für den menschlichen Benutzer versteckten Eingabefeldes. Der Spambot füllt dieses mit z.B. CSS unsichtbar gemachtes Feld aus, was ein echter Benutzer nie machen würde oder nicht machen kann. Folglich handelt es sich um einen Spam-Beitrag, wenn das Feld ausgefüllt oder verändert wurde.
<form>
 Benutzer-Name: <input name="userName" value="" type="text" />
 <div style="display:none">
  Irrelevantes Feld: <input name="andererName" value="" type="text" />
 </div>
</form>

Des Weiteren kann man die angegebenen E-Mail-Adresse oder Website auf ihre Existenz prüfen, damit Fakes automatisch rausfliegen.
Mit PHP könnte man das wie folgt realisieren:
<?php
$email 
'user@example.org'// die E-Mail-Adresse des Benutzers
$mailhost preg_replace('#^.+@(.+)$#''$1'$email); // Host auslesen
if(!getmxrr($mailhost$tmp)){ // Existenz des Mail-Servers überprüfen
  // es gibt keinen Mail-Server für diese Adresse
  
echo 'Die E-Mail-Adresse scheint nicht zu existieren'
}
?>
Wenn nun eine E-Mail-Adresse à la sqkjsl@lwpzsm.com angegeben wird, spuckt die Kontrolle die Meldung aus, die Adresse existiere nicht. (Anmerkung: Es wird nur geprüft, ob hinter der Adresse auch ein Mail-Server existiert und nicht ob die Adresse an sich tatsächlich existiert.)
Die Gültigkeit der Website lässt sich beispielsweise mit cURL so überprüfen:
<?php
$url 
'http://example.com/'// Die Website des Benutzers
$ch curl_init(); // Anfrage vorbereiten
curl_setopt($chCURLOPT_URL$url);
curl_setopt($chCURLOPT_NOBODYtrue);
curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
curl_exec($ch);
if(
curl_errno($ch)!=|| curl_getinfo($chCURLINFO_HTTP_CODE)>=400){
  
// Die Website ist nicht erreichbar
  
echo 'Die Website scheint nicht zu existieren';
}
curl_close($ch);
?>
Auch hier würde eine Website wie http://www.sjktpwnx.com/ rausfliegen. Diese Methode funktioniert natürlich nur, wenn der Spambot eine inhaltslose Platzhalter-URL einsetzt und nicht auf seine eigene Spam-Seite verlinkt.

Ähnlich wie das Erkennen von Spam anhand bestimmter Keywörter, gibt es die Möglichkeit, Beiträge auf anderssprachige Schriftzeichen zu überprüfen. Wenn man einen deutschsprachigen Blog oder ähnliches betreibt, haben chinesische, japanische, arabische oder kyrillische Zeichen im Text nichts verloren. Somit kann man davon ausgehen, dass es sich um einen automatisierten Spamtext handelt.
<?php
$text 
$_POST['text']; // der Beitrag des Benutzers
if(preg_match('#[\x{0400}-\x{1DBF}\x{2C80}-\x{1D0FF}]#u'$text)){ // unerwünschte Zeichen suchen
  // es gibt unerwünschte Zeichen
  
echo 'Der Beitrag enthält unerwünschte Zeichen'
}
?>
Bei obigem Beispiel wird bei allen Zeichen „Alarm“ geschlagen, bei welchen es sich nicht um Zeichen aus dem Lateinischen und Griechischen Alphabet sowie Sonderzeichen handelt. Ein Spambeitrag aus Russland würde somit als solchen herausgefiltert.
Aber auch bei dieser Methode kann es zu Problemen kommen, wenn sich das Thema um fremdländische Sprachen o.ä. dreht.

Falls ein Spambot trotz seines Misserfolgs wiederholt versucht Spam zu platzieren, empfiehlt es sich den Wiederholungstäter zu blockieren, beispielsweise mittels einer IP-Sperre über Htaccess:
Order allow,deny
Allow from all
Deny from 123.45.67.89

Meine Webscripting-Seite wurde kürzlich von Spammern heimgesucht, wobei alle Kommentare mit nicht existenten E-Mail-Adressen und Websites abgesendet wurden, daher hätte die oben beschriebene Methode bzgl. E-Mail-Kontrolle gegriffen. Ein Filter nach üblichen Spam-Keywords hätte den Spam ebenfalls identifizieren können.
 


Andere Einträge