Mensch oder Maschine? Grafische Captchas erstellen

Bots müssen draußen bleiben
Kommentare

Mit der wachsenden Anzahl von Internetdiensten hat auch das Thema Sicherheit eine immer größere Bedeutung erlangt. Wie schützen Sie Ihre Anwendung vor „Spam Robotern“ oder Brutforce-Attacken? Wie schützen Sie Ihre Anwender vor Passwortklau? Captchas versprechen die Lösung. Die häufigste Variante von Captchas sind kleine Grafiken, welche es ermöglichen sollen, Computer und reale Anwender zu unterscheiden. Wie dies funktioniert und wo die Gefahren liegen, zeigt Ihnen dieser Artikel.

Captcha steht für „Completely Automated Public Turing-Test to Tell Computers and Humans Apart“. Mit diesem Akronym ist auch schon der eigentliche Zweck von Captchas erklärt. Es geht um die Unterscheidung von Mensch und Maschine. Nahezu alle Onlineaktivitäten eines reellen Anwenders lassen sich auch durch automatisierte Programme (Bots) ausführen. Meist geschieht dies mit bösartigem Hintergrund. So werden beispielsweise Umfragen manipuliert, Passwörter mittels Brutforce-Methoden gehackt, Inhalte geklaut oder Spam in beliebigen interaktiven Anwendungen wie Foren und Blogs verbreitet. Diese Bots arbeiten ohne Interaktion mit einem Anwender im Hintergrund und sind somit äußerst effektiv und beliebt. Es ist an dem Entwickler, diesen Bots möglichst hohe Hürden in den Weg zu legen.

Theorie

Captchas kann man auch als gestellte Aufgaben bezeichnen, welche für Menschen einfach zu lösen sein sollen, für Computer hingegen sehr schwer. Die häufigste Form eines Captchas sind kleine Grafiken mit verzehrten Buchstaben (Abb. 1).

Einige grafische Captcha-Beispiele

Die Grafiken werden dynamisch generiert und dem Benutzer angezeigt. Dieser muss nun die zu erkennenden Worte oder Ziffernfolgen in ein Formularfeld eingeben. Geschieht dies erfolgreich, so wird davon ausgegangen, dass es sich um einen reellen Anwender handelt.

Es gibt auch noch andere Formen von Captchas, welche alle demselben Zweck untergeordnet sind; die Unterscheidung zwischen Mensch und Maschine. So zum Beispiel Abfragen des Allgemeinwissens oder das Lösen von Logikprüfungen, allerdings bergen diese Ansätze ebenfalls die Gefahr, dass sie durch einige Anwender nicht korrekt lösbar sein werden.

In diesem Artikel wollen wir uns aber vor allem auf die Erstellung von grafischen Captchas und die Erklärung der Technik konzentrieren. Grafische Captchas finden sich auf einer Vielzahl von Seiten, auf denen eine Registrierung nötig ist oder sensible Dienste vor Bots geschützt werden sollen. Natürlich schlafen auch die Entwickler von Bots nicht, und die vom Computer generierten Grafiken können mittels OCR ebenfalls von einem Computer ausgewertet und entschlüsselt werden. Dies ist ungleich schwieriger als das Erstellen eines Captchas. Da die Entwickler solcher Programme aber leider Geld mit ihren meist unseriösen Tätigkeiten verdienen, ist es nur eine Frage des Kosten-Nutzenfaktors. Niemand wird ein Programm entwickeln, das ein Captcha eines selbst entwickelten Gästebuchs von Peter Lustig entschlüsselt.

Handelt es sich aber beispielsweise um ein populäres Gästebuchskript, welches auf Tausenden von Internetseiten eingesetzt wird, dann könnte sich die Entwicklung eines solchen Programms für Spamer durchaus lohnen. Eine detaillierte Proof-of-Concept-Darstellung eines gelungenen Spam-Angriffs auf eine durch Captchas geschützte Blog-Software wurde von Casey Chesnut auf seiner Webseite veröffentlicht.

Sollten Sie sich für die Verwendung eines Captchas entschieden haben, gibt es gewisse Regeln zu beachten, um das Entschlüsseln so kompliziert wie möglich zu gestalten. Allerdings sollten die von Ihnen erstellten Grafiken von Menschen problemlos entschlüsselt werden können. Es gilt daher, einen gesunden Mittelweg zu finden. Sie sollten sich dennoch bewusst sein, dass es kein hundertprozentig sicheres Captcha gibt.

Faktoren für gelungene Captchas
  • Verwendung von verschiedenen Schriftarten und Farben
  • Verwendung verschiedener Helligkeitsstufen
  • Keine horizontal ausgerichteten Texte
  • Benutzung von Groß- und Kleinschreibung
  • Benutzung von Texten, die in keinem Wörterbuch zu finden sind
  • Darstellung von sich überschneiden-den Buchstaben
  • Benutzung einer zufällig generierten Anzahl von Buchstaben
  • Verwendung von geneigten, rotierten und verzer rten Buchstaben
  • Farbverläufe für den Hintergrund und die Buchstaben
  • Gitternetze in der Schriftfarbe der Buchstaben
  • Einige Buchstaben heller als der Hintergrund, andere dunkler
Erstellung des Captchas

Nach der Theorie machen wir uns nun an die Erstellung unseres ersten Captchas. Leider bietet dieser Artikel nicht genügend Spielraum, um aufwändige Captchas nach obigen Regeln zu erstellen. Wir werden uns daher auf die Klärung der technischen Fragen konzentrieren und lediglich eine einfache Grafik generieren. Es ist am interessierten Leser, diese Grundlagen zur Erstellung weiterer Varianten zu verwenden. Die benötigten Werkzeuge legen wir Ihnen nachfolgend in die Hand. Die wohl bekannteste Library für die dynamische Erstellung von Grafiken unter PHP ist die GD Library, welche wir in Listing 1 verwenden werden.

Zuerst benötigen wir einen String, welcher später als Captcha dargestellt und vom Benutzer erkannt werden soll. Die Funktion mk_string() generiert für uns eine solche Zeichenkette. Sie definiert eine Reihe von erlaubten Zeichen, welche dann nach dem Zufallsprinzip sortiert werden. Einige Buchstaben und Zahlen sind in manchen Schriftarten schwer voneinander zu unterscheiden und finden daher keine Berücksichtigung (i,l,1,o,0).

Als Rückgabewert erhalten wir unseren String, der im nächsten Schritt als Captcha dargestellt werden soll. Dies geschieht in der Funktion mk_Captcha($Captcha_string). In dieser Funktion werden alle grafischen Operationen ausgeführt. Die Funktion erstellt eine JPEG-Datei mit unserem Captcha-String und speichert das erzeugte Bild im Verzeichnis antibrutforce_images/$this_image.

Als Rückgabewert liefert uns die Funktion den Dateinamen des erzeugten Captchas, welcher zur Einbettung des Bildes in HTML benötigt wird. Als Dateiname wird ein MD5 Hash des übergebenen Strings verwendet. Dies ermöglicht uns, die Benutzereingabe zu einem späteren Zeitpunkt zu verifizieren.

Listing 1
------------------------------------------------------------------------------------------------------------------------------
<?php function mk_string($size = 6) {
   $rnd_string = "";
   $chars = str_shuffle("23456789QWERTYUIPLKJHGFDSAZXCVBNMabcdefghjkmnpqrstuvwxyz");
   for ($i=0; $i 
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -