eine einfache CAPTCHA-Funktion

eine CAPTCHA-Funktion schützt Formulare vor Spam Eine CAPTCHA-Funktion schützt Formulare vor Spam. Wer ein WordPress-Blog betreibt, braucht seinen Besuchern kein umständliches Captcha vorsetzen sondern kann getrost auf “goldwerte” Dienste wie Akismet oder Spam Karma 2 zurückgreifen. Während Akismet IPs und Inhalte mit seiner Online-Datenbank abgleicht um die Bösewichte zu finden, filtert Spam Karma den Inhalt nach Auffälligkeiten.

Außerhalb eines CMS, oder beim Verwenden einer eigenen Redaktionssystem-Kreation die ohne solche Mechanismen, setzt man seine Formulare der grausamen Webrealität aus. :D Fahrlässig!
Da bleibt einem oft nur die Möglichkeit eine CAPTCHA-Funktion zu benutzen.
Umsetzen kann man soetwas mit einer Reihe von vorgefertigten, umfangreichen Klassen oder Funktionen. (lesenswert dazu auch der Wikipedia-Eintrag Captcha).

Die einfachste und simpelste Form eines CAPTCHAs auf die ich bisher gestoßen bin, hat der Programmierer Donald Tetto geschrieben. In seinem Galerie-Skript Folderblog kommt eine sehr einfache und auch einfach zu integrierende Funktion zum Einsatz.

1. Das Formular vorbereiten

Zunächst baut man das Bild und das zugehörige Textfeld in sein Formular (also innerhalb des <form>-Elements)

  1. <img src="./landscape.php" alt="beautiful landscape" />
  2. <input size="4" maxlength="4" name="C" />

2. Die eigentliche Datei

Den folgenden Code speichern wir in die soeben als Bild verlinkte Datei im selben Verzeichnis, wo sich auch die Webseite mit dem Formular befindet.

  1. <?php
  2. session_start();
  3. $letters=substr(str_shuffle("ACDJKMNOPSTVWXYZ"),0,4);
  4. $image = imagecreate(40,16);
  5. imagecolorallocate($image, 255, 255, 255);
  6. imagecolorallocate($image, 0, 0, 0);
  7. imagecolorallocate($image, rand(50,175), rand(125,225), rand(125,225));
  8. imagecolorallocate($image, rand(125,225), rand(50,175), rand(125,225));
  9. imageline($image, 0, rand(9,14), 40, rand(2,7), 2);
  10. imagestring($image, 5, 3, 0, " " . $letters[0] . " " . $letters[1], 1);
  11. imageline($image, 0, rand(2,7), 40, rand(9,14), 3);
  12. imagestring($image, 5, 3, 0, $letters[2] . " " . $letters[3], 1);
  13. $_SESSION["md5"] = md5($letters[2] . $letters[0] . $letters[3] . $letters[1]);
  14. header('Content-type: image/png');
  15. imagepng($image);
  16. ?>

Beim Aufruf der Seite (und damit des Bildes) generiert diese Datei eine Zufalls-Buchstabenkombination und zeigt das Bild an, es generiert die md5-Checksum des Buchstabensalats und schreibt sie in eine Session.

Das input-Feld gibt dem Besucher nun die Möglichkeit den angezeigten Text zu bestätigen.

3. Formulardaten annehmen und verarbeiten

In der Datei in der man den Formularinhalt weiterverarbeitet hat man nun die Möglichkeit die Eingabe in dem Feld, mit Namen “captcha”, auf Korrektheit zu prüfen, bevor man mit dem Formularinhalt nun irgendetwas anstellt.

  1. $captcha = $_POST['C'];
  2. if ( isset($captcha) &&
  3. strlen($captcha) &&
  4. isset($_SESSION["md5"]) &&
  5. $_SESSION["md5"]==md5(strtoupper($captcha)) )
  6. {
  7. // das Captcha wurde erfolgreich validiert.
  8. print "Danke für Ihre Mitteilung/Kommentar/etc.";
  9. }

Fertig.

So einfach kann man sich Ruhe von nervigen Spam-Mails verschaffen.
Wenn man es noch etwas hübscher haben will, kann man statt der Standarschrift auf eine eigene Schriftdatei zurückgreifen. Eine angepasste Version, zusammen mit einer Freefont kann man sich hier als ZIP-Datei herunterladen. (Dazu braucht man eine halbwegs aktuelle PHP Version mit GD Bibliothek mind. aber v3.0.8)

Als Tip sei noch etwas eigentlich selbstverständliches angemerkt: bei der Auswahl der möglichen Lettern (und der Schrift) sollte man dem Besucher zu Liebe auf Unverwechselbarkeut achten. Das ist ja sonst nur frustrierend, wenn man nicht weiß ob man jetzt ein O (oooh) oder eine 0 (null) (oder auch bei 8 und B oft problem.) eingeben soll.

Schlagworte: , , ,

2 Kommentare zu „eine einfache CAPTCHA-Funktion“

  1. nora sagt:

    Guten Abend,
    erst mal vielen Dank für den captcha. Leider bin ich (noch)blutjunge Anfängerin mit PhP und brauche Anleitung. Wo genau sollte der code im beastendem script eingefügt werden?
    Danke im Voraus für Ihre Hilfe. Nora

  2. Peter sagt:

    Hallo Erik !
    Vielen Dank recht interressant.
    Funktioniert leider nicht. Oder sende mir mal einfertiges Beispiel.
    Zeigt zwar die Grafik an aber alles weitere geht nicht.

    Vielleicht könntest Du Alles etwas aufführlicher beschreiben.

    MfG Peter

Kommentieren