Gästebuch-Spam bekämpfen

Vorwort

In den letzten Jahren hat sich das Internet einer starken Wandlung unterzogen und ist heute wichtiger Bestandteil des täglichen Lebens vieler Menschen. Online-Handel hat sich sehr stark entwickelt und damit auch der Wettbewerb im Netz. Da im Worldwide Web weniger strenge Kontrollen als echten Leben stattfinden, sind auch die Werbemethoden entsprechend frecher, unterstützt von der Anonymität der Werbenden. Die erste große Plage war und ist Email-Spam. Web-Crawler durchstreifen die Webseiten nach verwertbaren Email-Adressen und lassen darauf ihren Spam los, getrieben durch die Hoffnung, damit einfaches Geld zu machen.

Mit der Einführung wirksamer Spam-Filter sind neue Arten der "Gewinnmaximierung" gefragt. In seriösen Kreisen spricht man von "Search Engine Optimization (SEO)", was auch mit fairen Mitteln bewerkstelligt wird, während weniger seriöse Techniken "Search Engine Manipulation" betreiben. Ein großer Teil dieser Ausgeburt stellt Gästebuch-Spam dar. Dabei werden ganz bewusst die interaktiven Teile von Webseiten (meist eben Gästebücher und dergleichen) genutzt, um Links auf die eigene Seite (bzw. die des Auftraggebers) zu setzen und dadurch höhere Suchmaschinen-Rankings zu erreichen. Dazu sollte vielleicht kurz erwähnt werden, wie Suchmaschinen Webseiten einstufen: Umso öfter eine Seite verlinkt ist, umso wichtiger muss sie auch sein, weshalb das Ranking ein besseres ist. Dies ist natürlich nur eine grobe Vereinfachung, der Grund für Gästebuch-Spam ist damit aber gut erklärt.

Da Gästebuch-Spam natürlich nicht von individuellen Personen ausgeführt wird, sondern automatisiert von Spam-Bots mit entsprechend größerer Leistungsfähigkeit, was Spam-Einträge pro Minute betrifft, ergibt sich eine Plage für jeden Webseiten-Betreiber mit eingebundenem Gästebuch oder Kommentarmöglichkeiten wie auf meiner Webpräsenz. Im harmlosesten Fall sind solche Einträge nur lästig, im schlimmsten Fall führt das ganze dazu, dass ein Gästebuch nicht mehr benutzt werden kann und darauf verzichtet werden muss. Damit das alles nicht passiert, habe ich mir die Zeit genommen, Techniken zusammenzufassen, mit denen man derartigen Spam minimieren bzw. unterbinden kann. Für die Code-Beispiele wird großteils PHP verwendet, andere server- bzw. clientseitige Scriptsprachen (Achtung: Diese müssen nicht immer zur Verfügung stehen!) sind im Allgemeinen ohne größere Einschränkungen möglich. An dieser Stelle vieleicht auch gleich folgender Hinweis zu den Code-Beispielen:

Für die angeführten Code-Beispiele übernehme ich keinerlei Verantwortung oder Garantie! Diese sind daher vielmehr als Code-Skizzen zu verstehen, eine saubere Implementierung bleibt Aufgabe des jeweiligen Anwenders!

Techniken zur Bekämpfung von Gästebuch-Spam

Bevor man nun unüberlegt eine Auflistung von irgendwelchen "Ideen" angeht, sollte man sich das Ziel nocheinmal gründlich abstecken. In unserem Fall ist das Hauptziel, ehrlich gemeinte Einträge von (menschlichen) Besuchern von solchen, die von Bots generiert und auf andere Webseiten verweisen, zu trennen. Damit stellt sich aber sofort die Frage, was einen von einem Menschen verfassten Eintrag von einem Bot-Eintrag unterscheidet. Die Frage der Unterscheidung ist also vielmehr nach einem WAS als nach einem WIE. Hier sollten also die Köpfe zu rauchen beginnen, alle (für den Gästebuch-Betreiber relevanten) technischen, soziologischen und sonstige Aspekte sind zulässig! Nach etwas intensiverem Nachdenken sind mir die folgenden Unterscheidungsmerkmale eingefallen:

  1. Ein Bot kann Text nicht "lesen", nur schreiben und eventuell Schlüsselwörter erkennen, ein Mensch kann sehr wohl den Text (im Kontext) verstehen
  2. Ein Bot "schreibt" Text sehr viel schneller als ein Mensch
  3. Ein Bot kann mit Bildern praktisch nichts anfangen
  4. Ein Bot hat als einziges(!) Ziel, Links zu anderen Webseiten loszuwerden
  5. Ein Mensch ist intelligent
  6. Ein Mensch verwendet immer einen Browser
  7. Ein Mensch liest und interpretiert keine HTML-Tags

Die Punkte können durchaus auch etwas enger oder weiter gehandhabt werden, ich möchte aber bitte keine Haarspalterei-Diskussionen, ob z.B. ob Punkt 6 immer erfüllt ist.

Damit hat sich das eher abstrakte Problem "Gästebuch-Spam unterbinden" über das etwas weniger abstrakten Problem "menschlichen Besucher von Bot unterscheiden" hin zum konkreten Überprüfen der eben genannten Unterscheidungsmerkmale gewandelt. Dabei ist aber zu beachten, dass die Punkte nicht "scharf" sind, ein Mensch kann sich in einem Punkt auch als Bot verhalten und umgekehrt. Ein Punktesystem kann dagegen Abhilfe schaffen.

Nachdem das Problem bzw. die Aufgabenstellung analysiert ist, können nun konkrete Filter erstellt werden. Diese unterscheiden sich aber in Erkennungszuverlässigkeit und Benutzereinschränkung sehr stark, weshalb ich sie in Kategorien einteile, die den Grad der ausgeschlossenen Benutzer unterscheidet. Dies mag anfangs etwas übertrieben erscheinen, da diese pro Technik eher einen geringen Prozentsatz darstellen, aber da in der Regel mehrere Techniken in Kombination verwendet werden, kann das unterm Strich zu einem beträchtlichen Anteil ausgeschlossener Besucher führen!

Techniken ohne Ausschluss von Besuchergruppen

Die folgenden Techniken schließen keine Besucher aus, egal ob sie Text-Browser verwenden, Sehschwäche haben oder client-seitige Skriptsprachen deaktiviert haben. Überdies merkt der Benutzer im Regelfall nichts von den Bot-Überprüfungen und wird dadurch nicht abgeschreckt.

Timestamp - Flotte Bots per Zeitstempel entlarven

Eine einfache, aber sehr effektive Methode ist es, die Zeit zwischem Aufruf der Seite und Versand der Nachricht zu prüfen. Dies kann sehr leicht serverseitig geschehen, indem ein Text-Feld mit dem Attribut "hidden" ins Formular eingebunden wird. Ein menschlicher Besucher braucht für das Absenden eines Gästebuch-Eintrags oder (vernünftigen) Kommentars im Regelfall mindestens 5 Sekunden, während ein Spam-Bot das in einer wesentlich kürzeren Zeit hinbekommt. Die Zeitspanne kann natürlich je nach Anwendungsfall angepasst werden, bei einer Kommentarmöglichkeit mit vorangehenden Artikel kann die Zeitspanne auch ruhigen Gewissens auf 30 Sekunden oder sogar wesentlich mehr gesetzt werden, während eine eigene Seite ausschließlich für das Erstellen des Gästebucheintrages keine großen Erhöhungen erlaubt.

Eine Implementierung mit PHP könnte etwa wie folgt aussehen: Das Skript eintrag_erstellen.php stellt das Formular zur Verfügung, eintrag_verarbeiten.php trägt den Eintrag in die Datenbank (oder wo auch immer) ein:

   //////// eintrag_erstellen.php ////////
   ...
   <?php 
     echo "<input type=\"hidden\" name=\"timestamp\" value=\"" . time() ."\">";
   ?>
   ...
   //////// eintrag_verarbeiten.php ////////
   ...
   <?php 
     if (time() - $_GET["timestamp"] > 5){
        //Eintrag verarbeiten
     } else {
        //Spam-Alarm!
     }
   ?>
   ...

Um es den Bots nicht zu leicht zu machen, kann man den Timestamp auch rudimentär verschlüsseln, ein gefälschter Timestamp ist dann nämlich sogar ein sicherer Spam-Indikator!

Worthless - Seite für Bots wertlos machen

Eine weiterer sehr weit verbreiteter Tipp ist, Suchmaschinen das Katalogisieren der Seite und aller darauf verlinkten Seiten zu verbieten. Das ist mit einem einzigen HTML-Meta-Tag im Head möglich (siehe dazu auch robot-Meta-Tag auf de.selfhtml.org):

   <!-- Verbietet den Suchmaschinen die Indizierung -->
   <meta name="robots" content="noindex">
   <!-- Verbietet den Suchmaschinen, den Links zu folgen -->
   <meta name="robots" content="nofollow">
   <!-- Kombination der beiden vorigen Anweisungen -->
   <meta name="robots" content="noindex, nofollow">

Für den Bot würde eine nofollow-Anweisung reichen, um ihm den Nutzen zu verderben, jedoch würde damit die Suchmaschine immer noch den Spam-Inhalt katalogisieren. Andererseits ist es dem Bot dann eigentlich auch egal, ob eine Indizierung stattfindet, er kann immer noch darauf hoffen, dass menschliche Besucher dem Link folgen und wird seinen Spam daher trotzdem hinterlassen. Für separate Gästebuch-Bereiche mögen die Meta-Anweisungen dennoch sinnvoll sein, um zu verhindern, dass ein Bot überhaupt das Gästebuch findet, für Kommentarmöglichkeiten unterhalb von Artikeln sind sie jedenfalls sinnlos, da damit der Artikel nicht mehr gefunden wird.

Scores - Eine Art Punkteführerschein für den Eintrag

Meist unterscheiden sich Spam-Einträge grundlegend von den Einträgen menschlicher Besucher. Im deutschsprachigen Raum ist beispielsweise ein in Englisch gehaltener Eintrag ein guter Indikator für Gästebuch-Spam. Ebenso weisen Worte wie "Tramadol", "Viagra" oder "Phentermine" auf Spam hin. Nicht zu vergessen natürlich die eigentliche Absicht, einen Link im Gästebuch zu hinterlassen, was in HTML mit "<a href=" eingeleitet wird. Solche Zeichenketten können im Eintrag gezählt werden und schließlich je nach erreichter Punktezahl als Spam eingestuft werden oder nicht. Auch hier empfiehlt sich eine etwas behutsamere Vorgehensweise: Ein Eintrag ist nicht automatisch Spam, wenn nur eines der Wörter gefunden wird! Außerdem besitzen manche Wörter eine höhere Wahrscheinlichkeit, in Spam aufzutauchen als andere, weshalb man die Trefferanzahl zusätzlich gewichten sollte. Ein einfacher Filter könnte wie folgt aussehen:

   <?php 
     $eintrag = $_GET["eintrag"]     
     $punkte = 0;
     $punkte = $punkte + 1 * substr_count(strtolower($eintrag), 'viagra');
     $punkte = $punkte + 2 * substr_count(strtolower($eintrag), 'phentermine');
     $punkte = $punkte + 2 * substr_count(strtolower($eintrag), 'tramadol');
     $punkte = $punkte + 3 * substr_count(strtolower($eintrag), '<a href=');
      
     if ($punkte < 5){
        //Eintrag verarbeiten
     } else {
        //Spam-Alarm!
     }
   ?>

In diesem Beispiel wird angenommen, dass Viagra tendenziell eher auch in den gewünschten Beiträgen vorkommen könnte (z.B. in einem Witz) und daher weniger stark gewichtet. Der Versuch, einen Link im Eintrag unterzubringen, wird dagegen noch stärker bestraft. Entsprechend kann man auch vorgehen, wenn man separate Felder für Email oder Homepage hat und die ermittelte Punktezahl addieren. Die Schwelle, aber der ein Eintrag als Spam eingestuft wird, muss man nach "gutem Gefühl" festlegen, ein Patentrezept dafür gibt es nicht. Es sollte ohnehin mehr Aufwand in eine gute Auswahl der Schlüsselwörter gelegt werden, dann ergibt sich eine sinnvolle Schranke fast von selbst.

Obfuscation - Den Bot narren

Bots erkennen die Bestimmung der Textfelder (meist) über deren Namen. Die Namen der Textfelder werden nämlich in weiterer Folge als Variablennamen der verarbeitenden Skripte benutzt. Ein menschlicher Besucher dagegen erkennt die Bestimmung der Textfelder durch die danebenstehenden Bezeichner. Diese kleine, aber feine Unterschied kann dazu verwendet werden, Bots im großen Stil zu überlisten! Betrachten wir dazu das folgende HTML-Formular:

   <!-- schlechte Variante eines Gästebuchformulars -->
   ...
   <form action="script.php" method="get">
   Name: <input name="Name" type="text"><br>
   Email: <input name="Email" type="text"><br>
   Homepage: <input name="Homepage" type="text"><br>
   Eintrag: <textarea name="Entry" cols="50" rows="10"></textarea>
   <input type="submit" value="Absenden"> 
   </form>
   ...

Aus Sicht des Bots ist ein derartiges Formular optimal: Die Namen der Textfelder beschreiben den erwarteten Inhalt, noch dazu auf Englisch! Ein menschlicher Besucher sieht dagegen die nebenstehenden Wörter "Name:", "Email:" und "Eintrag:"

Eine erste Möglichkeit ist nun, irgendwelche bedeutungslosen Namen zu vergeben. Ein "dummer" Bot versucht dann sein Glück mit Raten. Dabei wird er sogar oft erfolgreich sein, da die Reihenfolge oft die gleiche ist. Ein "schlauer" Bot würde sein Glück wohl an den nebenstehenden Bezeichnern versuchen, wenn er mit dem Textfeldnamen nichts anfangen kann.

Eine noch bessere Variante ist es, die Namen der Textfelder bewusst zu vertauschen. Zwar wird der Eintrag nach wie vor in ein Textfeld erfolgen, weshalb man diesen nicht zu vertauschen braucht, dafür können aber die Felder für Name, Email und Homepage gemischt werden. Vor allem "Homepage" ist ja für Bots wie für die Gelsen das Licht, warum also nicht gerade das ausnützen? Meiner Meinung nach ist es sogar effektiver, nur die Textfeldnamen für Email und Homepage zu vertauschen! Der HTML-Code des Formulars wäre damit also:

   <!-- schlechte Variante eines Gästebuchformulars -->
   ...
   <form action="script.php" method="get">
   Name: <input name="Name" type="text"><br>
   Email: <input name="Homepage" type="text"><br>
   Homepage: <input name="Email" type="text"><br>
   Eintrag: <textarea name="Entry" cols="50" rows="10"></textarea>
   <input type="submit" value="Absenden"> 
   </form>
   ...

Das verarbeitende Skript braucht dann nur auf zwei Merkmale testen: Steht im Feld für die Homepage eine Emailadresse (einfaches Testen auf '@' genügt) oder umgekehrt, so ist uns ein Bot auf den Leim gegangen! Sofern es kein Feld für die Homepage gibt, kann das Spiel auch mit einem Vertauschen von Name und Email gespielt werden, dann muss aber die Email-Adresse besser getestet werden, da durchaus "kunstvolle" Besuchernamen mit diversen Sonderzeichen denkbar sind.

Um es dem Bot noch schwerer zu machen, kann man zusätzlich alle Felder zu textareas machen und auch den Bezeichner für den eigentlichen Eintrag vertauschen. Bei komplexeren Layouts steht überdies der für den menschlichen Besucher sichtbare Feldbezeichner nicht mehr direkt neben der Textfeld-Deklaration im HTML-Code, womit die Wahrscheinlichkeit umso größer ist, den Bot zu überlisten!

Auf einen kleinen Nachteil dieser Bot-Täuschung möchte ich aber noch hinweisen: Die Browser-Autovervollständigung wird dadurch irritiert. Formulardaten werden anhand der Namen der Felder gespeichert und da nun die Namen vertauscht sind, unterliegt auch der Browser dieser Täuschung, sofern er nur über die Feldnamen unterscheidet.

Moderiertes Gästebuch

Die vermutlich beste Möglichkeit, Spam von der Seite fern zu halten, ist ein moderiertes Gästebuch bzw. eine moderierte Kommentarmöglichkeit. Dabei lässt sich der Webmaster per Mail über neue Einträge benachrichtigen und kann dann selbst entscheiden, ob dieser Eintrag danach tatsächlich auf der Seite erscheint. Diese Methode ist aber trotzdem mehr schlecht als recht, da der Webmaster jedes Spam-Mail lesen muss und dann eine entsprechende Aktion tätigen muss. Außerdem ist es für den Eintragenden wenig ermutigend, wenn sein Beitrag nicht gleich aufscheint.

Bayes-Filter

Was sich bei Emails bewehrt hat, ist natürlich auch gegen Gästebuch-Spam gut. Ein Bayes-Filter hat aber den Nachteil, dass er eine Zeit lang trainiert werden möchte, bevor er richtig gut funktioniert. Da aber Gästebuch-Spam meiner Erfahrung nach weitaus weniger häufig auftritt, dauert es unter Umständen ewig, bis ein Bayes-Filter richtig "scharf" ist. Außerdem ist das oben vorgestellte Punktesystem eigentlich nichts anderes als ein statischer Bayes-Filter, der nicht trainiert wird.

Techniken bei Ausschluss von sehr wenigen Besuchergruppen

In diesem Unterabschnitt möchte ich Techniken präsentieren, die nicht mehr transparent für alle Anwender sind. Die präsentierten Techniken werden daher entweder wahrgenommen (schreckt möglicherweise ab) oder schließen solche Benutzer jene aus, die mit sehr außergewöhnlichen Browser-Konfiguration im Internet unterwegs sind. Der Anteil abgeschreckter bzw. ausgeschlossener Besucher liegt aber nach wie vor weit unter einem Prozent.

Traces - Wie kommt es zu einem Eintrag?

Ein nicht unwesentlicher Punkt ist, dass ein menschlicher Besucher nicht direkt die Adresse der Eingabemaske in seinen Browser eingibt. Ebenfalls wird ein solcher niemals das Formular für einen neuen Eintrag zu seinen Favoriten hinzufügen. Ein menschlicher Besucher wird daher immer zuerst eine Seite mit Inhalt ansteuern und dann bei Interesse einen Eintrag hinterlassen (aufgrund dieser notwendigen Annahme habe ich diese Technik nicht in die Kategorie ohne Benutzerausschluss eingeordnet). Manche Bots steuern dagegen direkt das Eingabeformular an und können dadurch entlarvt werden. Dazu muss man aber die Seitenaufrufe serverseitig protokollieren, was gerade bei PHP mit Sessions sehr leicht von der Hand geht.

Wirklich gut funktioniert diese Methode jedoch nur, wenn das Eingabeformular eine eigene Webseite ist, weshalb sie nicht für Kommentarmöglichkeiten direkt im Anschluss an einen Artikel zu gebrauchen ist. Nehmen wir an, es gibt drei Seiten gaestebuch_anzeigen.php, gaestebuch_formular.php und gaestebuch_abgesendet.php. Erstere zeigt das Gästebuch an, zweitere beinhaltet das Formular, um einen neuen Eintrag zu hinterlassen und letztere nimmt den Eintrag entgegen (diese Funktionalität kann gegebenenfalls auch von gaestebuch_anzeigen.php übernommen werden). Die entsprechenden Code-Abschnitte wären wie folgt:

   //////// gaestebuch_anzeigen.php ////////
   <?php 
     session_start();
     $_SESSION['visited'] = true;
     /* Um non-Cookie-Browser nicht auszuschließen, sollten Links zu
        gaestebuch_formular.php die Session-ID angehängt bekommen */
   ?>
   ...
   //////// gaestebuch_formular.php ////////
   <?php 
     session_start();
     /* Hier kann auch der Timestamp abgespeichert werden */
   ?>
   ...
   //////// gaestebuch_abgesendet.php ////////
   <?php 
     session_start();
     if ($_SESSION['visited'] == true){
         //eintragen bzw. weitere Tests     
     } else {
         //Spam-Alarm     
     }
   ?>
   ...

Damit Benutzer, deren Browser keine Cookies annehmen, nicht ausgeschlossen werden, sollte die Session-ID direkt über die Links übergeben werden. Eine etwas abgespecktere Variante davon ist, dem Formular von gaestebuch_anzeigen.php aus eine Variable zu übergeben, die sich mit der Zeit ändert, wie beispielsweise der Timestamp, der dann in ein hidden-Feld eingetragen wird. Dadurch kann ebenfalls geprüft werden, ob der Eintragende auch zuvor das eigentliche Gästebuch gesehen hat, während Bots, die die Adresse vor geraumer Zeit irgendwo aufgegabelt haben, einen "veralteten" Link aufgerufen haben und dadurch entlarvt werden. Das Auslesen des Referrers ist dagegen weniger empfehlenswert, da dieser vom Browser nicht übertragen werden muss!

We are not evil! - Den Besucher fragen

Eine sehr einfache und dennoch wirkungsvolle Methode ist es, vor dem Absende-Button ein Checkbox einzufügen, die der Benutzer ankreuzen muss. Dazu reicht ein einfacher Suggestivtext wie etwa "Ich bestätige, kein Spam-Bot zu sein". Durch diese einfache Checkbox sollte eigentlich noch kein User zurückschrecken und diese markieren. Ein einfach gestrickter Spam-Bot wird diese jedoch schlicht und einfach übersehen und nicht ankreuzen. Dies kann sogar noch weiter getrieben werden, indem zwei oder drei derartige "Fragen" durch ankreuzen zu beantworten sind. Ein Spam-Bot würde entweder alle oder gar keine Box ankreuzen, daher sind die Texte so zu wählen, dass der Benutzer mindestens eine Box ankreuzen und mindestens eine Box nicht ankreuzen muss. Um den Besucher nicht schon vorzeitig abzuschrecken, kann sowas auch als Zwischenschritt im Absendevorgang eingebaut werden. Nachdem der Besucher seinen Eintrag geschrieben hat und auf Absenden geklickt hat, kommt er zur Seite mit den "Zwischenfragen" und sofern er auch diese beantwortet, wird sein Eintrag akzeptiert. Ob man soetwas seinen Besuchern zumuten möchte, ist allerdings eine andere Frage!

Smart? - Besucherintelligenz testen

In eine ähnliche Kerbe wie die vorangegangene Methode schlägt die Methode, den Eintragenden eine zufällig generierte Rechenaufgabe oder ähnliches zu servieren. Das Ergebnis kann man als hidden-Feld mitübertragen, sicherheitshalber sollte man dieses aber mit einem Faktor multiplizieren, damit der Bot nicht einfach nur "abschreiben" muss. Der Code für dieses Spielchen wäre wie folgt:

   <?php 

     $random1 = rand(1,10);
     $random2 = rand(1,10);

     echo "Ergebnis von " . $random1 . " plus " .$random2 . ": ";
     echo "<input type=\"text\" name=\"aufgabe\">";
     echo "<input type=\"hidden\" name=\"loesung\" value=\"" . 4 * ($random1 + $random2) . "\">";
   ?>
   ...

Der Check im verarbeitenden Skript wäre dann eine einfache if-Abfrage:

   <?php 
   if ( 4 * $_GET["aufgabe"] == $_GET["loesung"] ){
      //Eintragen bzw. weitere Checks
   } else {
      //Spam-Alarm!
   }
   ?>
   ...

Auch hier muss der Betreiber wieder abwiegen, ob er soetwas seinen Besuchern antun möchte oder nicht. Alternativ kann er diese Rechenaufgabe wieder als kleinen Zwischenschritt einbauen, jedoch muss diese Aufgabe dann auch klar gekennzeichnet sein, damit sie nicht übersehen wird!

Diverse weitere Indikatoren für Spam-Bots

Das Punktesystem aus der ersten Kategorie kann durch weitere Indikatoren verfeinert werden, welche allerdings auch Benutzer mit exotischeren Browserkonfigurationen treffen kann.

Zu diesem Check gehört zum einen der Browser-Check. Im HTTP-Request übergibt normalerweise der Browser des Besuchers seine Bezeichnung, wie zum Beispiel "Mozilla/5.0 (compatible; Konqueror/3.2; Linux 2.6.2) (KHTML, like Gecko)". Sofern diese fehlt, ist das meist ein Hinweis auf einen Spam-Bot. Überprüfungen am eigenen Webserver haben jedoch ergeben, dass der User-Agent meist auf etwas Vernünftiges gesetzt ist.

Wesentlich auffälliger war hingegen, dass Spam-Bots noch mit HTTP/1.0-Anfragen arbeiten, während (einigermaßen) moderne Browser mit HTTP/1.1-Anfragen arbeiten. Daher kann dieses Kriterium durchaus auch im Punktesystem berücksichtigt werden! Eine PHP-Abfrage wäre über

   <?php 
   if ( strcasecmp($_SERVER['SERVER_PROTOCOL'], "HTTP/1.0") == 0 ){
      //Punkte erhöhen
   }
   ?>
   ...

einfach zu realisieren.

Techniken bei Ausschluss einer bereits beträchtlichen Besucheranzahl

In diesem Unterabschnitt sind noch Techniken zu finden, die zwar auch viele Spam-Einträge aufhalten können, aber auf Kosten bestimmter Benutzergruppen geht, deren Anteil im Allgemeinen durchaus im Prozent-Bereich anzusiedeln ist. Je nach Zielgruppe der Webseite kann eine der präsentierten Techniken jedoch dennoch attraktiv sein, oder der Betreiber nimmt einen Ausschluss ganz bewusst in Kauf.

Captchas - Code in Bildern erkennen

Captachas sind kleine Bilder, die ein paar verzerrte Buchstaben beinhalten, die ein Mensch sehr leicht, ein Computer aber nur sehr schwer lesen kann. Genauere Informationen finden sich in Captcha bei Wikipedia.

Dieser Test schränkt aber aus mehreren Gründen ein: Ein Besucher darf keine Sehschwächen haben und muss außerdem Bilder in seinem Browser aktiviert haben. Benutzer von Text-Browsern wären somit ausgeschlossen.

Der Grund, weshalb Captchas gerne als das "Allheilmittel" gegen Spam angepriesen werden, ist ein einfacher: Es lässt sich damit Geld machen! Im Internet sind viele Dienste zu finden, die Checks über Captchas anbieten. Es finden sich aber auch freie Skripte, die solche Captchas erzeugen.

Invisible - Ich sehe was, was du nicht siehst...

Man kann Spam-Bots auch dadurch narren, dass man ihnen zusätzliche Textfelder in einem Formular vorgaukelt, die der normale Benutzer in Wirklichkeit gar nicht sieht! Ein Spam-Bot kümmert sich aber meist nicht darum und füllt das Feld dennoch aus, vor allem dann, wenn es so attraktive Namen wie "Homepage" hat. Der HTML-Code für solche Tricks sieht beispielsweise so aus:

   <!-- Ein degeneriertes Textfeld -->
   <input type="text" name="test" style="height: 0px; width: 0px;">
   <!-- Ein Textfeld außerhalb des sichtbaren Bereiches-->
   <input type="text" name="test" style="position: absolute; left=-1000px;">

Der Nachteil dieser Methode ist allerdings wiederum, dass damit Besucher mit Textbrowsern verwirrt werden könnten sowie ältere Browser die Elemente trotzdem darstellen könnten. Sofern man aber auf seiner Webseite bereits Textbrowser von vornherein ausgeschlossen hat (z.B. weil man seine Fotos herzeigt, etc.), so ist diese Methode durchaus sehr effektiv. Um diesen Trick vor den Spam-Bots noch besser zu verbergen, sollten die CSS-Style-Anweisungen in einer separaten Datei liegen, weil diese vom Spam-Bot normalerweise nicht separat angefordert wird.

Client-Side-Scripts - Keine Skripte, kein Eintrag!

Eine interessante Möglichkeit ist, den HTML-Code für das HTML-Formular client-seitig von einem Skript erzeugen zu lassen. Ein Spam-Bot muss daher über eine Skript-Engine verfügen, um an das Formular zu kommen, womit bereits ein großer Prozentsatz von vornherein ausfällt. Um es dem Bot nicht allzu einfach zu machen, wenn dieser dennoch eine Script-Engine besitzt, sollte der Script-Code in eine separate Datei ausgelagert werden. Als Beispiel habe ich hier ein JavaScript in einer Datei printFormular.js, das ein Formular in einem HTML-Dokument gaestebuch.html erzeugt

   /* Datei printFormular.js */
   function testwrite() {
      document.write("<form action=\"eintragen.php\" method=\"get\">");
      document.write("Name: <input name=\"Name\" type=\"text\"><br>");
      document.write("Eintrag: <textarea name=\"Eintrag\" cols=\"50\" rows=\"10\"></textarea>");
      document.write("<input type=\"submit\" value=\"Absenden\">");
      document.write("</form>");
   }   
   <!-- Datei gaestebuch.html -->
   ...
   <!-- Einbinden der JavaScript-Datei im Header -->
   <script src="jstest.js" type="text/javascript"></script>
   ...
   <!-- Aufrufen der Funktion an entsprechender Stelle im HTML-Body -->
   <script type="text/javascript">
      testwrite();
   </script>

Der Nachteil an dieser Methode ist jedoch, dass client-seitige Skripte sehr oft deaktiviert sind, womit man einem großen Anteil an menschlichen Besuchern ein Gästebuch bzw. eine Kommentarmöglichkeit vorenthält. Sind jedoch client-seitige Skripte ohnedies erforderlich für eine korrekte Funktion, so spricht eigentlich nichts gegen diese Möglichkeit.

Flash - Mit Multimedia zum Ziel

Eine sehr effektive Methode gegen Gästebuchspam ist, dieses in Flash zur Verfügung zu stellen. Praktisch kein Spam-Bot kann damit umgehen - man ist frei von Spam! Dass der Browser des Besuchers Flash-fähig sein muss, der Benutzer das Flash-Plugin installiert haben muss und dieses auch aktiviert haben muss, steht allerdings auf einem anderen Blatt Papier (bzw. auf einer anderen Website, falls Papier schon zu altmodisch ist... ;-) ).

Wenn es nicht gerade Flash sein soll, kann man dafür auch Java verwenden, aber hier hat man die gleichen Probleme wie mit Flash: Java-Funktionalität ist oft nicht vorhanden!

Methoden, die nur auf den ersten Blick helfen

Es gibt auch Möglichkeiten, mehr als nur Spam zu bekämpfen und über das Ziel hinaus zu schießen. Diese möchte ich kurz anreißen, um den Lesern, die es bis hierher durchgehalten haben, noch ein Gefühl mit auf den Weg zu geben, welche Techniken im Regelfall nicht helfen.

IP-Sperren

Sehr oft ist in diversen Foren zu lesen, dass sich jemand vor Gästebuch-Spam durch Blocken von IP-Adressen schützt. Im Regelfall ist das aber sinnlos, da Spam-Bots auf Zombie-Rechnern laufen und diese wechseln wie die Unterhosen. Ich habe beispielsweise bei stichprobenartigen Überprüfungen keine zwei Spam-Einträge von der gleichen IP-Adresse festgestellt! Richtig gefährlich wird das Blocken sowieso dann, wenn man Proxy-Server blockt, weil man damit gleich effektiv ein ganzes Subnetz blockt. Abgesehen davon müss(t)en veraltete Sperren wieder aufgehoben werden, um nicht die neuen Inhaber der IP schuldlos auszuschließen.

Registrierungszwang

Ein Registrierungszwang schreckt jeden potentiellen Verfasser ab! Ich selbst würde nie einen Artikel auf einer mir unbekannten Seite kommentieren, wenn ich mich dafür zuerst registrieren muss, es ist einfach zu aufwendig (psychologisch!). Für ein Gästebuch gilt ähnliches, persönliche Freunde würden sich vermutlich trotzdem die Mühe machen, aber kaum jemand sonst.

Email-Bestätigungen

Die Methode der Email-Bestätigungen ist noch die ungefährlichste Methode und könnte eigentlich sogar in eine der obigen Kategorien fallen. Allerdings schreckt das auch hier Benutzer ab (nicht so viel wie eine Registrierung, aber doch) und hat einen entscheidenden Nachteil: Unsorgfältig programmiert wird der Webserver selbst zur Spam-Schleuder! Abgesehen davon nimmt man dem Benutzer die Freiheit zu entscheiden, ob er seine Email-Adresse preisgeben möchte. Auch wenn diese dann im Eintrag selbst nicht mehr angezeigt wird, baut das eine Hemmschwelle auf. Wie jedoch eingangs erwähnt, kann im Einzelfall auch diese Methode hilfreich sein.

Schlusswort

Ein Patentrezept gegen Gästebuch-Spam gibt es nicht, aber viele ganz gute Mittel, um dem Situation Herr zu werden. Jede Methode für sich ist nicht perfekt, aber ein guter Mix kann praktisch den gesamten Spam unterbinden. Jedoch entwickeln sich auch die Spam-Bots weiter, womit manche Techniken in absehbarer Zeit nicht mehr funktionieren könnten, jedoch wird es dieses Katz'- und Maus-Spiel weiterhin geben, wie es bereits seit Anbeginn der Spam-Ära der Fall ist.

Abschließend möchte ich bitten, bei Wünschen, Anregungen, Beschwerden, etc. die Kommentarmöglichkeiten zu benutzen oder direkt per Mail mit mir in Kontakt zu treten, ich freue mich über jedes ernst gemeinte Feedback! Wer nach all dem Gefasel über Spam nun auch etwas schmunzeln möchte, der möge doch auch meine Zusammenstellung des witzigsten Gästebuch-Spams durchlesen.



Kommentare:



Jürgen Frey , am 5. 5. 2013 um 22:43
Hallo
Gute Seite.
hat aber alles nix genutzt.
Aber wenn man die Seite die auf ein Gästebuch hinlinkt beim Link einen Parameter mit auf den Weg gibt mit GET und den dann auf der Gästebuchseite im PHP Teil abfragt und damit das Eingabefeld ausblendet hat es sich.
Die Bots gehen auf die GB Seiten los oder auf die PHP Scripts die die Eingaben auswerten aber ohen den Parameter in GET können die gar nicht erst Daten eingeben.

Die Wahrscheinlichkeit, dass ein Gast die GB Seite direkt aufruft mit www.xxxxxxx.de/gaestebuch.php ist gegen Null. Alle kommen über die Hauptseite über einen Link. Und den sieht der Bot erst mal nicht. Der geht direkt auf die GB Seite los. Ohne Erfolg.

hat bei mir letztendlich als einzigste Lösung funktioniert.

Jumbo das Tier
Michael, am 1. 4. 2013 um 17:22
Schreibfehler:
Als Beispiel habe ich hier ein JavaScript in einer Datei printFormular.js, dass ein Formular in einem HTML-Dokument gaestebuch.html erzeugt

Hier ist ein "das" ohne doppel-S gefragt.

Gruss

Danke, ist korrigiert! Karli
Paul, am 25. 1. 2013 um 15:00
Guter Artikel
longchamp outlet, am 13. 12. 2012 um 13:03
Hi, great article it's exactly the point
smartbyte, am 2. 11. 2012 um 05:09
Hi Meister,

ich habe noch eine Technik fuer Dich: Die Idee mit dem Javascript ist schon nicht schlecht, aber ich habe alles innerhalb des Form Tag base64 codiert, und speicher dann nur die Base64 codierte version des HTML ab! JavaScript decodiert die dann, und zeigt sie im Browser an.
Da das Script mit PHP arbeitet habe ich in PHP weiter alles im Klartext stehen, und codiere es on-the-fly.
Leider kann Javascript kein Base64 codieren, so dass man sich einen Base64 decoder aus dem Netz laden muss, aber die sind nur ca. 30 Zeilen code. Das geht also noch...

Danke fuer die Seite! Bekomme seit ein paar Stunden gar keinen GB-Spam mehr!
Danke fuer den Hinweis mit Base64! :-) Lg, Karli
Basti, am 26. 8. 2012 um 15:13
Heißen Dank! Endlich ist unser GB Spamfrei!
Ich hätte nie gedacht, dass Spambots auf eine kleine, "unbedeutende" Feuerwehrhomepage kommen.

Ich musste erst noch ein paar Änderungen in PHP vornehmen, was für einen Laien nicht so einfach ist. Wie z.B. der exit-Befehl. Aber jetzt klappt es bestens!
Ich hab bereits über 3500 Einträge gekillt, wovon jeder einzelne in der Datenbank überprüft werden musste.
Denn es hätte ja sein können, dass ich echte Einträge lösche.

Gruß
Basti
Flo, am 28. 5. 2012 um 21:38
Coole Seite!Hilft weiter und ist zu empfehlen :D Tx
Heri, am 22. 4. 2012 um 11:12
Guten Tag,
ich habe mit Begeisterung Ihre Kommentare zu dem Thema gelesen. Seit Kurzen bin ich Opfer von Spam-Einträgen im Gästebuch der Internetseite, die ich für meine Frau erstellt habe. Leider bin ich nur Laie im Thema Webseiten zu erstellen bzw. genauere Details einzuprogrammieren. Ich habe von Anfang an die Sichtbarkeit unterdrückt und gebe nach Kontrolle die Einträge frei. Als nächste werde ich Ihren Tipp, die E-Mail-Adresse als Pflichtfeld zu machen, umsetzen. Und das Thema "Timestamp" finde ich auch ganz gut. Ganz toll Ihre Tipps - danke!

Sollte mal die Neugierde geweckt sein - hier die von mir mit Typo3 erstellte Seite (natürlich mit Hilfe von Kollegen): www.fusion-klarinette.de
Krishan, am 14. 4. 2012 um 03:00
Besten Dank für die nützlichen Tips. Mit einer Kombination aus 'Timestamp', 'Worthles' und 'We are not evil' ist unser Gästebuch seit 2 Wochen Spam-frei.
Die meisten Bots scheitern an der Mindestzeitvorgabe.

Gruss Krishan
fox, am 2. 4. 2012 um 07:05
Also ich war ja schon immer ein "Anti-Flasher", aber für Formulare gibt es nichts besseres! Zumal heute sowieso JEDER schon alleine wegen youtube das Flashplug installiert hat. Und wenn ich daran denke, wie ultra nervig jedesmal das Ablesen und eingeben von Captchas ist... ne danke! Verstehe sowieso nicht, wieso youtube das Comment-Fenster nicht auch in flash macht, der Player ist es ja auch.
Kommentar des Webmasters: Flash ist nicht auf allen Plattformen verfügbar, insbesondere nicht auf iPads. Dementsprechend kann YouTube eine so signifikante Nutzermenge nicht einfach aussperren.
Michi, am 6. 12. 2011 um 09:41
danke, einfach (und) interessant.
Julian57, am 23. 10. 2011 um 20:31
Sehr schöner Artikel zu Spamschutz.
Vielen Danke!
Peter, am 19. 6. 2011 um 11:25
gute tipps
Armin, am 27. 5. 2011 um 19:13
Danke. Gute und einfache Tipps
RaveKev, am 12. 10. 2010 um 15:30
Das sind alles recht schnell einzubauende Hilfsmittel gegen Spam, ohne ein Captcha zu benutzen. Danke
Stephan, am 20. 7. 2010 um 23:04
Super, genau sowas habe ich gesucht, jetzt werde ich mal versuchen den Spammern das Leben schwer zu machen.
artep, am 18. 6. 2010 um 09:47
Nachtrag: werd das Gästebuch in Flash umschreiben. Da kommt keiner so leicht dran!!!! Nieder mit den Doofen Spams!!!!!!!
artep, am 18. 6. 2010 um 09:44
Super zusammengetragen Danke
adrian, am 14. 5. 2010 um 15:39
ich denke mal mehr als die hälfte der kommentare sind wieder spam!!
http://www.skihelm-24.de
Keiner, am 14. 5. 2010 um 13:23
Findet ein andere Art Bot sicher gut, dass Du hier die E-Mail Adressen Deiner Besucher veröffentlichst ;)
Klaus, am 9. 1. 2010 um 10:14
genial
partyshqip (http://1nate.com), am 21. 12. 2009 um 18:08
haha :) sehr gut :D
christliche singlebörse (http://www.christlove.de), am 11. 12. 2009 um 16:01
Werde es versuchen umzusetzen. Mal schauen ob es klappt.
Holger (http://www.mshi.de/), am 11. 12. 2009 um 12:27
Wir haben uns aufgrund der vielen Probleme, die trotz aller Vorkehrungen auftreten gegen ein Gästebuch entschieden.
waldi (http://www.waldkraiburg-info.de), am 8. 12. 2009 um 10:24
du hast hier wirklich gute Ansätze gebracht, die ich mit Sicherheit mal persönlich testen werde, gute Arbeit
Sandra (http://ghwaldhauser.gh.funpic.de/), am 22. 11. 2009 um 14:11
Danke für die tollen Tipps.
Mike (http://www.novo-games.com), am 14. 11. 2009 um 06:13
Super Tipps. Vielen Dank.
Gruß Mike
Phil (http://www.go-rhythm.de), am 16. 10. 2009 um 17:21
Vielen dank für die Tips, werde sie gut gebrauchen können!
Andreas (http://www.luftballonland.de/), am 7. 10. 2009 um 15:58
Danke für die tollen Tipp´s. Moderiertes bloggen ist zwar ne gute Lösung- nur was hilft sie, wenn die russischen Spams pro Tag ca. 200 mal/Tag versuchen, ihren Mist loszuwerden. Ich kann doch niemanden abstellen, der sich den ganzen Tag damit auseinandersetzt. (haben mehrere blogg´s) Aber danke für die anderen wertvollen Tipp´s!
Grüße bis dahin,
Michael (http://www.drcarhifi.de), am 27. 9. 2009 um 21:56
Super tipps. Wir setzen das mal so um.
Letztes Update dieser Seite am 1. 4. 2013