Logo Hauptsache Kommunikation zum 15-jährigen Juibläum

CAPTCHA und der versteckte Honigtopf

von | 2. Apr 2012 | Fachthemen

Da ich ja hier keine Doktorarbeiten schreibe, darf ich ja auch mal abschreiben. Und ich nenne auch die Quelle am Ende des Artikels. Ich sage sogar dazu, dass ich den Tipp von Kollegen bekommen habe. Aber jetzt endlich zur Sache.

Wir Webworker kennen das ja: Schöne Seite mit ein paar Formularen aufgebaut, ein paar Tage gewartet und – Peng! – schon haben wir die Spam-Bots auf der Seite. Im Extremfall hatte ich das mal bei einem Gewinnspiel für einen beliebten Frischkäsehersteller. Das dümpelte so mit ein paar hundert Teilnahmen pro Woche vor sich hin und plötzlich hatten wir 80.000 an einem einzigen Tag. Die Qualität der dadurch generierten Leads und Adressen ist natürlich vollkommen für die Füße und daher ist man dann als Web-Technologe dazu aufgerufen, hurtigst eine Lösung zu finden.

Bisher haben wir dann ja immer einen sogenannten CAPTCHA-Test eingebaut. Sie wissen schon, diese verzerrten, kryptischen, bei Google gar nicht lesbaren Buchstaben/Zahlen-Kombinationen, die man abtippen soll, um zu beweisen, dass man ein echter Mensch aus Fleisch und Blut ist. Wer genau wissen will, woher der komische Name „CAPTCHA“ kommt, dem sei der passende Wikipedia-Artikel empfohlen.

Aber ganz ehrlich: Gerne baut man ja so einen CAPTCHA-Test nicht ein. Der Kollege aus der Kreation schlägt die Hände über dem Kopf zusammen („Gibt’s die Dinger auch in schön?“), die Usability ist schon per se grenzwertig und Diskussionen gibt’s dazu immer. Entweder mit dem Kunden („Brauchen wir das wirklich, Herr Sangmeister?“) oder mit dem Entwickler („Wenn ich das so machen soll, wie es der Designer will, brauche ich vier Stunden extra.“).

Glücklicherweise stieß ich durch den besagten Tipp von den Kollegen und etwas Internet-Recherche auf Alternativen. Dazu ist es erstmal wichtig zu wissen, wie Spam-Bots funktionieren.

Playback-Bots lesen die Daten zum Beispiel aus einem POST-Stream und füllen dann die entsprechenden Abschnitte mit eigenen Inhalten. Diese Bots merken leider auch nach einer gewissen Zeit, wenn sich etwas an den Formular-Feldern, z.B. den Feldnamen, ändert. Man kann sie allerdings stoppen, indem man versteckte Formularfelder mit variablen Inhalten einbaut. Am leichtesten geht das mit einem Timestamp. Damit weiß das Skript, welches die Formulardaten verarbeitet, wenn die Informationen zu alt sind. Weiter verbessern lässt sich dieses Prinzip, wenn man zusätzlich noch die IP-Adresse des Client-Computers einbaut. Damit kann das verarbeitende Skript erkennen, wenn mehrere Anfragen im gleichen Zeitraum von unterschiedlichen Rechnern gesendet werden.

Formular-Bots sind etwas – aber auch nur etwas – intelligenter. Sie „analysieren“ ein Formular und erkennen die Felder des Formulars. Anschließend generieren sie ihre eigenen Inhalte und schicken diese an das weiterverarbeitende Skript. Diese Bots lassen sich stoppen, indem man die „Hidden-Honeypot“-Methode anwendet. Hierbei wird ein Formularfeld eingefügt, das vor dem menschlichen Formular-Benutzer versteckt wird – zum Beispiel per CSS oder JavaScript. Im Skript kann man nun prüfen, ob dieses Feld ausgefüllt wurde. Ist dies der Fall, handelt es sich mit sehr hoher Wahrscheinlichkeit um einen Spam-Bot.

Schließlich soll es tatsächlich auch noch menschliche Spammer geben, die unsere Blogs manuell mit Kommentaren wie „Toller Artikel, bitte mehr davon!“ füllen und es nicht versäumen, dabei einen Link auf ihre russische Online-Apotheke und deren aktuelle Viagra-Angebote zu hinterlassen. Gegen die ist natürlich kein Kraut gewachsen – zumindest kein skript-basiertes.

Wer noch mehr Anregungen braucht oder genauere Anleitungen, wie man die oben erwähnten Techniken einsetzt, dem sei die Lektüre des Original-Artikels von Ned Batchelder empfohlen, von dem ich hier so hemmungslos abkupfere.

Hier einfach nochmal eine kurze Anleitung in Form einer Checkliste, wie man Spam-Bots bekämpfen kann, ohne ein CAPTCHA zu verwenden:

  • Timestamp als Hidden-Field einbauen
  • Info als Hash aus IP-Adresse des Clients, Timestamp, einem Schlüssel-Wert und evtl. weiteren Informationsfeldern einbauen
  • Feldnamen per Hash-Funktion verschlüsseln
  • Feld einfügen, welches per CSS oder JavaScript versteckt wird und nicht ausgefüllt werden darf (Hidden Honeypot)
Hauptsache Kommunikation