Captchas in PHP

Captchas sollen Webseiten vor automatisiertem Missbrauch durch Software schützen. Sie lassen sich leicht mit einem PHP-Script erzeugen. Absoluten Schutz können sie jedoch nicht bieten.

In Pocket speichern vorlesen Druckansicht
Lesezeit: 10 Min.
Von
  • Hubert Benjamin Ritzdorf
  • Christian Kirsch
Inhaltsverzeichnis

Ein Turing-Test soll zwischen einem menschlichen und einem Elektronengehirn unterscheiden. Captchas versuchen damit Webangebote vor Bots zu schützen.

Fast jeder hat sie schon mal gesehen und sich gefragt, welchen Zweck sie eigentlich erfüllen: Kleine Bilder mit verschwommenen, verzerrten Zeichen vor beliebigem Hintergrund, die der Besucher der Webseite in ein Textfeld schreiben soll. Es sind sogenannte Captchas – „Completely Automated Public Turing test to tell Computers and Humans Apart“, also ein automatischer, öffentlicher Test zur Unterscheidung zwischen Mensch und Machine.

Das Prinzip klingt einfach und wirksam. Schließlich ist es für jeden Menschen ein Leichtes, den verzerrten Text aus dem Bild einzutippen, wohingegen der Computer diese Fähigkeit nicht besitzt. So kommen Captchas überall dort zum Einsatz, wo automatisierte Software Schaden anrichten könnte: in Foren und Gästebüchern zum Schutz vor automatischen Werbeeinträgen, bei Abstimmungen, bei der Beantragung neuer E-Mail-Adressen und an vielen weiteren Stellen.

Zu den positiven Aspekten dieser Technik gehört neben einem weitgehenden Schutz die einfache Implementierung, im Folgenden mit PHP veranschaulicht. Negativ ist anzumerken, dass ein Captcha mittlerweile kein Turing-Test im engen Sinne mehr ist, da Computer Text in Bildern mit wachsendem Erfolg erkennen können.

Bei der Implementierung von Captchas helfen verschiedene PHP-Erweiterungen, etwa die noch kaum dokumentierte Imagick-Image-Library, oder die besser beschriebene GD-Library, die jedoch weniger Funktionen bietet. Deshalb fiel die Wahl auf Imagick, das sich mit dem Shell-Kommando pecl nachinstallieren lässt. Es stellt die Klassen Imagick, ImagickDraw, ImagickPixel und ImagickPixelIterator bereit. Im folgenden Beispiel (siehe Listing 1) spielen nur die drei ersten eine Rolle.