Captchas in PHP

Seite 2: Texterzeugung

Inhaltsverzeichnis

Zu Beginn erzeugt es die nötigen Objekte, setzt den Hintergrund auf Weiß und stellt die Schriftart für das ImagickDraw-Objekt ein. Mehr Sicherheit bieten Captchas, wenn das Skript die Schrift für jedes Zeichen zufällig bestimmt. Allerdings ist darauf zu achten, dass sie in allen möglichen Varianten lesbar bleiben. Ein Wechsel zwischen mageren und fetten Schriften empfiehlt sich nicht, da die fetten Buchstaben mehr Platz benötigen und durch Überlagerung die Lesbarkeit leidet.

Dem Setzen der Schriftgröße folgt das Erzeugen des anzuzeigenden Zufallstexts. Von der zufälligen Auswahl aus Wörterbüchern ist dabei abzuraten, da dies Angreifern die Arbeit erleichtert. Stattdessen sollte man eine Menge von Großbuchstaben und Zahlen festlegen, die das Captcha enthalten darf. 1, I und J oder 0, Q und O eignen sich nicht, da auch normalsichtige Besucher sie schwer unterscheiden können. Mischt man beispielsweise den String aus allen erlaubten Zeichen und liest ab einer Zufallsposition sechs Zeichen aus, sollte das für eine solche Anwendung ausreichend sicher sein.

Nun erzeugt das Imagick-Objekt ein neues 80 x 30 Pixel großes Bild. Es hat einen weißen Hintergrund und darüber einen mit addNoiseImage() erzeugten Haufen bunter zufälliger Pixel, sogenanntes Bildrauschen. Anschließend schreibt annotateImage() den Text hinein. Es ist zwar möglich, den gesamten Zufallsstring auf einmal auszugeben, doch kann man unaufwendig jedem Buchstaben eine zufällige vertikale Position geben (3. Parameter der Funktion) und ihn drehen (4. Parameter). Aufrufe von swirl() und wave() modifizieren den Text durch Drehen um die Bildmitte und wellenförmiges Verzerren. Damit ist das Captcha fertig. Die wave()-Funktion hat es gegenüber der ursprünglichen Vorgabe etwas vergrößert. Wer eine feste Größe benötigt, kann das Bild mit cropImage() zurechtschneiden.

Ein letzter Bearbeitungsschritt zeichnet vier zufällige Linien durch das Bild. Es empfiehlt sich, die Endpunkte mindestens einer Linie einzugrenzen, da sonst alle am oberen Rand liegen könnten. An dieser Stelle ist zu bemerken, dass es sicherlich immer „bessere“ und „schlechtere“ Captchas gibt, also sehr leicht zu entschlüsselnde und andere, die sogar für einen Menschen ein Rätsel darstellen. Es gilt, diese Extreme zu vermeiden und andererseits die nötige Variationsvielfalt zu schaffen, die ein allzu leichtes Entschlüsseln verhindert. In diesem Fall kann der Entwickler zum Beispiel durch Beschränkung der Zufallswerte sicherstellen, dass immer eine Linie von links unten nach rechts oben verläuft.

Nach dem Zeichnen der Linien legt das Skript das Bildformat als JPEG fest. Vor der Übergabe an den Browser muss es den Text speichern, um später die Eingabe überprüfen zu können. Das Speichern übernimmt üblicherweise eine Session-Variable, die erst nach dem Starten einer Session verfügbar ist.

Mit <img src="captcha.php"> bindet man das Captcha in ein HTML-Formular ein. Da möglicherweise auch ein Mensch den Text nicht erkennt, sollten Anwender ein neues Captcha generieren können. Des Weiteren benötigt man ein Feld für die Eingabe des Texts und einen Knopf zum Abschicken des Formulars.