Heinz-Jürgen Schymura

Captcha.php


Kurzanleitung zum schnellen Testen:
Captcha.zip herunterladen, aus dem Internet einen (freien) Schriftfont herunterladen (Googlesuche mit den 3 Worten .ttf Font download).
Captcha.zip in ein Verzeichnis entpacken (7-Zip).  Ein Unterverzeichnis Fonts dort erzeugen, den Schriftfont in dieses Verzeichnis kopieren. In der Konfigurationsdatei Captcha_config.php bei CAPTCHA_FONT_NAME den richtigen (relativen) Pfad und Dateinamen des Schriftfonts einsetzen.
Entweder alles auf den Webserver in ein Verzeichnis hochladen und testen, oder falls vorhanden mit xampp (eine freie und kostenlose Serverumgebung) auf dem eigenen Rechner testen. In beiden Fällen dazu nur Captcha.php im Browser ausführen.



Hier wird dann ausführlich die Arbeitsweise des PHP-Quelltext Programms Captcha.php vorgestellt. Außerdem auch die Erstellung der notwendigen HTML und PHP Dateien.

Achtung: Sie benötigen für den Betrieb, aber auch schon für einen Test von Captcha.php unbedigt einen Schriftfont, den Sie allerdings meist kostenlos aus dem Internet herunter laden können.

Captcha.php benötigt auf dem Server, in dem Verzeichnis, in dem es sich selbst befindet, eine Konfigurationsdatei, mit dem Namen Captcha_config.php in der Sie die Einstellungen für das Programm an Ihre Vorstellungen anpassen können.
Beim Aufruf von Captcha.php lädt dieses die Konfigurationsdatei ein. Wenn Sie genaueres zu Konfigurationsdateien und Konstanten unter PHP wissen wollen, dann können Sie ruhig unter dem Menüpunkt Hilfe Menüsystem 1 index.php nachlesen. 
In der Captcha_config.php werden 25 Festlegungen (define) gemacht. Außerdem werden 2 Arrays angelegt und mit jeweils 3 Werten belegt. Ich zeige Ihnen hier im folgenden ähnliche Einstellungen, mit denen ich die Bilder unter dem Menüpunkt Beschreibungen Captcha.php erzeugt habe.

define("CAPTCHA_ZEICHENLAEGE",6);
define("CAPTCHA_DIESE_ZEICHEN","234578ABCDEFGHJKMNPQRSTUCWXYZabcdefghjkmnpqrstuvwxyz");
define("CAPTCHA_BIS_WINKEL",50);
define("CAPTCHA_FONT_NAME","Fonts/Kein_SchriftFont.ttf"); 
define("CAPTCHA_FONT_GROESSE",30);
define("CAPTCHA_BILD_BREIT",250);
define("CAPTCHA_BILD_HOCH",50);
define("CAPTCHA_FORMEN",true);
define("CAPTCHA_FORMEN_ANZAHL",25);
define"CAPTCHA_LINIEN",true);
define("CAPTCHA_LINIEN_ANZAHL",25);
define("CAPTCHA_VERDREHEN",true);
define("CAPTCHA_VERDREHEN_ANZAHL",10);
define("CAPTCHA_VERDREHEN_DURCHMESSER",25);
define("CAPTCHA_VERDREHEN_WINKEL",10);
define("CAPTCHA_TEMP_DIR","tempdir/");
define("BILD_EXTENSION",".png");
define("TEXT_EXTENSION",".txt");
define("CAPTCHA_FORM_SOLL_POST",true);
define"CAPTCHA_FORM_DATEINAME","Captcha_Dateiname");
define("CAPTCHA_FORM_EINGABE","Captcha_Eingabe");
define("CAPTCHA_FORM_LADEN","Form_Belegen.php");
define("CAPTCHA_AKTION_RICHTIG","Rueck_Meldung.php");
define("CAPTCHA_AKTION_FALSCH","Form_Belegen.php");
 
$RotGruenBlau1=array(253,253,0);
$RotGruenBlau2=array(200,211,16);

Die erste Zeichenfolge bei den Festlegungen in den doppelten Hochkommas dürfen Sie nicht ändern, da PHP bei define immer die erste Zeichenfolge durch den zweiten Wert in der gleichen Zeile ersetzt. So kann ich im PHP-Quelltext Programm Captcha.php die Zeichenfolge CAPTCHA_DIESE_ZEICHEN schreiben und PHP ersetzt dieses dann durch den Wert der hinter dem Komma steht.
In der zweiten Zeichenfolge (mit doppelten Hochkommas) schreiben Sie einfach Ihre Angaben hinein um Captcha.php entsprechend zu konfigurieren.
Sie sehen, auch Zahlenwerte sind zulässig, dann aber bitte ohne doppelte Hochkomma, da diese in PHP für Zeichenfolgen reserviert sind.
Bei CAPTCHA_FORMEN etwa und auch bei anderen steht ein Wahrheitswert (true oder false). Auch diese werden ohne doppelte Hochkomma geschrieben.
Sie müssen immer auf die Groß- und Kleinschreibung bei Ihren Festlegungen achten, denn die meisten Server unterscheiden hier sehr genau. Ebenso ist es wichtig, dass Sie bei Verzeichnisangaben diese immer mit einem "/" beenden. Ausnahme: Wenn Sie keinen Angaben machen, dann halt nur "".
Auch die Zeichenfolgen $RotGruenBlau1 und $RotGruenBlau2 bei den Arrays dürfen Sie nicht verändern. Lediglich die 3 Werte dahinter können Sie beliebig ändern.

Und so sind die einzelnen, hier gezeigten, Festlegungen zu verstehen:
Hinter die Festlegung CAPTCHA_ZEICHENLAEGE schreiben Sie bitte als Zahl, wie lang bei Ihnen die zu erzeugende Captchazeichenfolge sein soll.

Hinter CAPTCHA_DIESE_ZEICHEN schreiben Sie bitte (in doppelten Hochkommas) alle Zeichen, aus denen die zu erzeugende Captchazeichenfolge bestehen darf (manche Zeichen lassen sich nur schwer vom Besucher unterscheiden, etwa O und 0). Das Programm wählt dann aus diesen Zeichen zufällig die unter CAPTCHA_ZEICHENLAEGE angegebene Anzahl von Zeichen zur Erzeugung der Captchazeichenfolge aus.

Bei CAPTCHA_BIS_WINKEL geben  Sie bitte als (positive) Zahl den Winkel ein, bis zu dem die einzelnen Zeichen nach rechts oder links gekippt werden dürfen. Auch hier erzeugt das Programm zufällige Werte für jedes Zeichen, die zwischen 0 und dem von Ihnen angegebenen Winkel liegen.

Unter CAPTCHA_FONT_NAME geben Sie bitte (in doppelten Hochkommas) den Pfad und den Dateinamen des zu nutzenden Schriftfonts an. Diesen Font müssen Sie sich erst noch besorgen (Internet). Die im Beispiel gezeigte Zeichenfolge Fonts/Kein_SchriftFont.ttf dient nur der Verdeutlichung, wie Pfad und Dateiname zu schreiben sind. Der Pfad (hier Fonts/) ist immer relativ von dem Verzeichnis aus anzugeben, in dem sich Captcha.php selbst befindet.

Bei CAPTCHA_FONT_GROESSE geben Sie bitte als (positive) Zahl die Schriftgröße der Zeichen für den zuvor angegebenen zu nutzende Schriftfont an.

Unter CAPTCHA_BILD_BREIT geben Sie bitte als (positive) Zahl die Breite des gesamten Captchabildes an.
Bei CAPTCHA_BILD_HOCH machen Sie bitte das gleiche für die Höhe des gesamten Captchabildes.
Die Breite und Höhe sollten Sie dann auch entsprechend in der HTML-Eingabeform so setzen.

Unter CAPTCHA_FORMEN finden Sie dann als erstes einen Wahrheitswert (true, false). Hier treffen Sie die Entscheidung, ob Captcha.php zufällig (Kreis, Rechteck) erzeugte Formen in die Captchagrafik zeichen soll. Soll das Programm Formen zeichnen, so setzen Sie bitte true, wenn nicht, dann bitte false. Auch die jeweilige Ausdehnung und  Farbe der Formen ist dann zufällig, wenn der Wert true gesetzt wurde.
Mit CAPTCHA_FORMEN_ANZAHL legen Sie als (positive) Zahl fest, wieviel Formen in die Captchagrafik gezeichnet werden, wenn Sie bei CAPTCHA_FORMEN den Wert auf true gesetzt haben.

Etwas ähnliches legen Sie mit CAPTCHA_LINIEN fest. Nur dass hier das Programm zufällig Linien in die Captchagrafik zeichnet, wenn Sie den Wert auf true setzen.
Mit CAPTCHA_LINIEN_ANZAHL legen Sie dann als (positive) Zahl die Anzahl der Linien fest, die erzeugt werden wenn CAPTCHA_LINIEN auf true gesetzt wurde.

Auch bei CAPTCHA_VERDREHEN legen Sie über den Wahrheitswert fest ob zufällige Ausschnitte (Kreise) aus der zuvor erzeugten Captchagrafik verdreht (und damit teilweise verzerrt) werden sollen.
Mit CAPTCHA_VERDREHEN_ANZAHL legen Sie bitte wieder als (positive) Zahl die Anzahl der zu verdrehenden Ausschnitte fest.
Bei CAPTCHA_VERDREHEN_DURCHMESSER geben Sie bitte als (positive) Zahl den Durchmesser des zu verdrehenden Kreises ein.
Und bei CAPTCHA_VERDREHEN_WINKEL können Sie dann als (positive) Zahl den Winkel angeben, um den die Ausschnitte gedreht werden sollen wenn bei CAPTCHA_VERDREHEN der Wert true eingestellt ist. Zu große Winkel verzerren nicht nur, sondern können die ganze Captchagrafik unlesbar machen.

Bei CAPTCHA_TEMP_DIR ist einiges zu erklären. Captcha.php speichert nach dem Erzeugen der Captchagrafik das erzeugte Bild als Datei mit einem Namen, der aus dem Hash-Wert der für die Captchagrafik zufällig erzeugten Zeichenfolge und dem Hash-Wert der aktuellen Zeit (Mikrosekunden) auf dem Server, gebildet wird mit der Extension des Wertes hinter BILD_EXTENSION. Diese Datei wird in dem Verzeichnis gespeichert, das Sie hinter CAPTCHA_TEMP_DIR bitte angeben. Der Pfad (hier tempdir/) ist immer relativ von dem Verzeichnis aus anzugeben, in dem sich Captcha.php selbst befindet. In diesem wirklich nur für temporäre Dateien zu nutzendem Verzeichnis werden bei einem erneuten Aufruf von Captcha.php vom Programm alle Dateien gelöscht, die älter als 1 Minute sind und die entweder die unter BILD_EXTENSION und auch hinter TEXT_EXTENSION festgelegte Dateinamenserweiterung haben. So wird dieses Verzeichnis nicht zugemüllt, aber es sollte nicht für andere als temporäre Dateien genutzt werden. Ab dieser Festlegung (CAPTCHA_TEMP_DIR) dienen die Eintragungen bereits auch schon der Zusamenarbeit mit der von Ihnen zu erzeugende HTML-Eingabeform und den von Ihnen zu erzeugenden PHP-Programmen, die dann die entsprechenden Reaktionen und Aktionen Ihren Wünschen gemäß ausführen, deren Namen Sie dann etwa unter CAPTCHA_FORM_LADEN festlegen können.

Hinter BILD_EXTENSION legen Sie dann als Zeichenfolge bitte die gewüschte Dateinamensextension für die Captchagrafik fest.

Und hinter TEXT_EXTENSION dann das gleiche für die anderen Dateien an, die von Ihren PHP-Programmen im temporären Verzeichnis erzeugt werden.

Mit CAPTCHA_FORM_SOLL_POST legen Sie bitte über den Wahrheitswert (true, false) fest, wie Ihre HTML-Eingabeform die entsprechenden Werte an Captcha.php sendet. Setzen Sie den Wert auf true, so erwartet  Captcha.php die Daten in der globalen PHP-Variablen Array, im anderen Fall in Array. Entsprechend Ihrer Festlegung der Methode in der HTML-Eingabeform etwa unter <form method="post" action="captcha.php"> setzen bitte diesen Wert.

Zu CAPTCHA_FORM_DATEINAME ist dann wieder etwas mehr zu sagen. Wie schon weiter oben beschrieben bildet Captcha.php sowohl aus der zufällig erzeugten Zeichenfolge für die Captchagrafik einen Hash-Wert und auch aus der aktuellen Zeit (Mikrosekunden) auf dem Server einen Hash-Wert, die beide mit einem "_" verbunden als Dateiname in die von Ihnen zu erzeugende HTML-Eingabeform im nicht sichtbaren (Sie müssen es auf hidden setzen) Input-Objekt mit dem hinter CAPTCHA_FORM_DATEINAME (in doppelten Hochkommas) festgelegten Namen als Wert hinter value= eingesetzt wird.
Zum Beispiel: Stünde in Ihrer HTML-Eingabeform etwa
<input name="Captcha_Dateiname" value="" type="hidden">
so würde Captcha.php bei einer Festlegung für CAPTCHA_FORM_DATEINAME mit Captcha_Dateiname etwa
<input name="Captcha_Dateiname" value="f8c77d937a9ab6a42b362ff0d2c0c707_993d6dbae4b2ed03a84dfca8babb91d3" type="hidden">
erwarten. Für das Belegen dieses Wertes Sind Sie zuständig (wird weiter unten bei der Besprechnung des mitgelieferten PHP-Beispielprogramms Form_Belegen.php erklärt).
So wird auch der Hash-Wert zum späteren Prüfen der Besuchereingabe in der HTML-Eingabeform festgehalten, ohne dafür noch eine aufwändige Datenbank nutzen zu müssen.

Auch in Ihrer  HTML-Eingabeform legen Sie mit dem Namen, dem Sie dem Input-Objekt geben, in dem der Besucher seine Eingabe der in der Grafik gezeigten Zeichen machen soll, fest, was Sie hinter CAPTCHA_FORM_EINGABE (in doppelten Hochkommas) schreiben müssen. Denn Captcha.php ermittelt dann aus der Rückgabe dieses Wertes und dem Vergleich des daraus gebildeten Hash-Werts mit dem ja ebenfalls übergebenen entsprechenden (auch ein Hash-Wert) Dateinamenteil, ob die Eingabe des Besuchers richtig ist.

Hinter CAPTCHA_FORM_LADEN tragen Sie bitte (in doppelten Hochkommas) den Namen (wenn notwendig mit relativem Pfad) des von Ihnen zu erstellenden PHP-Programms ein, das ausgeführt werden soll, wenn Captcha.php das erste mal von diesem Besucher aufgerufen wird. Captcha.php erkennt dies daran, dass es noch keine Übergaben von Daten in der unter CAPTCHA_FORM_SOLL_POST festgelegten Art gibt. Da in einer HTML-Eingabeform sehr viel unterschiedliche Objekte vorhanden sein können, die von Ihnen bei Bedarf (auch beim ersten mal) mit sehr unterschiedlich Daten vorbelegt werden können (hier dazu ausführliche Informationen und Anleitungen) müssen Sie wirklich selbst das hierzu notwendige PHP-Programm erstellen.

Bei CAPTCHA_AKTION_RICHTIG tragen Sie bitte in gleicher Art und Weise den Namen (wenn notwendig mit relativem Pfad) des (von Ihnen zu erstellenden) PHP-Programms, das aufgerufen werden soll, wenn sich die Eingabe des Besuchers als richtig erweist.

Wen wundert es jetzt noch, dass hinter CAPTCHA_AKTION_FALSCH in gleicher Art und Weise der Namen (wenn notwendig mit relativem Pfad) des PHP-Programms einzutragen ist, das aufgerufen werden soll, wenn sich die Eingabe des Besuchers als falsch erweist.
 
Mein Vorschlag: Dem Besucher die HTML-Eingabeform mit einer neuen Captchazeichenfolge und der daraus erzeugten Captchagrafik und dem neuen Dateinamen (aus den Hash-Werten erzeugt) wieder vorlegen, wobei alle (bis auf ein) Eingabeobjekt mit den Daten vorbelegt werden sollten, die der Besucher in der abgeschickten HTML-Eingabeform gesetzt hatte. Nur das Input-Objekt, in dem der Besucher seine Eingabe der in der Grafik gezeigten Zeichen machen soll (hinter CAPTCHA_FORM_EINGABE festgelegt) sollte leer sein.

Wenn Sie möcten, dann können Sie auch mehrmals das gleiche PHP-Programms bei den 3 letzen Festlegungen (CAPTCHA_FORM_LADEN, CAPTCHA_AKTION_RICHTIG, CAPTCHA_AKTION_FALSCH) aufrufen. Wichtig ist nur, dass Sie in Ihrem Programm dann entsprechend unterscheiden. Da die von Ihnen angegebenen PHP-Programme jeweils mit include von Captcha.php nach entsprechender Prüfung eingebunden werden sind alle bekannten Variablen aus dem Hauptteil und auch die Funktionen von Captcha.php auch in Ihren PHP-Programmen bekannt.
Zwar dürfen Sie keine Änderungen an meinem Programm vornehmen, aber natürlich können Sie die bekannten Variablen und auch die Funktionen nutzen.
Der Hauptteil von Captcha.php beginnt direkt hinter diesen beiden Zeilen im Programm:
/* ########################################################################### 
  Hier beginnt das Progamm, vorher sind alles (nur!) Funktionen #################### */

Wenn Sie sich erst in PHP einarbeiten wollen, oder wenn Sie mal für einen Befehl die exakte Syntax brauchen, so ist dieses PHP-Manual sehr zu empfehlen.

Weil PHP sehr eigen ist was die Reihenfolge von Festlegungen und Anlegen von Arrays betrifft, nun noch einige Worte zu den beiden Variablen $RotGruenBlau1 und $RotGruenBlau1.
Diese beiden Arrayvaiablen dürfen erst dann in der Konfigurationsdatei mit dem Namen Captcha_config.php stehen, wenn alle Festlegungen (define) getätigt sind, deshalb stehen sie am Ende der Datei.
Mit den jeweils 3 (positiven) Zahlenwerten können Sie den Hintergrund der Captchagrafik beeinflussen. Captcha.php benutzt beide Arrays und deren Werte um die Farben für den Verlauf des Hintergrundes zu bestimmen. Dabei ergibt 0,0,0 schwarz und 256,256,256 weiss. Anderen Wertekombinationen ergeben die Farben zwischen scharz und weiss.


Nachfolgend zeige ich Ihnen den HTML-Text der HTML-Eingabeform. Auf den Rest der Beispieldatei AbfrageMitCaptcha.htm gehe ich nicht weiter ein. Falls Sie mehr zu Formulare in HTML wissen wollen, so gibt es hier ausführliche Auskunft.

<form method="post" action="captcha.php">
<div align="center"> <b>Bemerkungen</b><br><br></div>
<input name="Captcha_Dateiname" value="" type="hidden">
<div align="center">
<textarea name="User_Bemerkungen" cols="80" rows="15"></textarea><br></div>
<br><div align="center">
<b>E-Mail</b>: <input name="E_Mail_Adresse" size="90" maxlength="130" value="" type="text"></div>
<br><div align="center">
<img alt="Captchagrafik" src="" height="50" width="250"></div>
<p align="center">
<b>Eingabe der in der Grafik gezeigten Zeichen:</b>
<input name="Captcha_Eingabe" size="20" maxlength="10" value="" type="text"></p>
<div align="center">
<input value="Abschicken" type="submit"><br></div>
</form>

In der ersten Zeile wird festgelegt, dass die HTML-Eingabeform die Daten mit post übergeben soll. Dementsprechend ist in der Captcha_config.php auch die Festlegung CAPTCHA_FORM_SOLL_POST auf true gesetzt.
Input-Objekte sind einzeilige Eingabeobjekte. Die unterschiedliche Typen (type=) lassen diese unterschiedliche Aktionen ausführen, also  etwa das Objekt in der Form unsichtbar machen, die Eingabe von Zeichen ermöglichen oder eine Aktion ausführen.
Wenn man mehr als die Eingabe in einer Zeile ermöglichen will, dann muss man das Eingabeobjekt textarea nutzen.
Auch eine Grafik kann in die Form eingebunden werden, dabei ist dann die Höhe und die Breite anzugeben, die mit den entsprechenden Angaben in der Captcha_config.php übereinstimmen sollten.

Um zu testen, ob die Eingabe (der Zeichen aus der Captchagrafik) des Besuchers richtig ist muss Captcha.php nur die (im Beispiel per POST) übermittelten Angaben aus den define hinter CAPTCHA_FORM_DATEINAME (in der Form Captcha_Dateiname) und CAPTCHA_FORM_EINGABE (in der Form Captcha_Eingabe) der Form entsprechend vergleichen und kann dann die in Captcha_config.php hinter CAPTCHA_FORM_LADEN, CAPTCHA_AKTION_RICHTIG und CAPTCHA_AKTION_FALSCH festgelegten (von Ihnen zu erstellenden) PHP-Programme entsprechend (wieder per include) aufrufen.

Im Weiteren beziehe ich mich auf das von mir in der ZIP-Datei mitgelieferte PHP-Beispielprogramm Form_Belegen.php, das Sie sich in einem Textanzeigeprogramm (etwa Notepad unter Windows) anschauen können.
Nachdem geprüft wurde, ob die zum Arbeiten unbedingt notwendige HTML-Eingabeformdatei auch wirklich vorhanden ist wird in der
Zeile 9 der Inhalt der Datei in eine einzige Zeile (erleichtert das Suchen von Zeichenfolgen) in die Variable eingelesen. Entsprechend der in Zeile 10 bereits von Captcha.php gesetzten (und auch hier gültigen) Variablen wird der folgende Anweisungsblock entweder übersprungen, oder ausgeführt.
Wird der Anweisungsblock ausgeführt, weil es nicht das erste mal war, so sind die anderen, vom Besucher bereits eingegebenen Eingaben an der entsprechende Stelle der HTML-Eingabeform einzusetzen, denn der Besucher würde sich ärgern, wenn er nochmals alles neu eingeben müsste, nur weil ihm ein Fehler bei der Eingabe der Zeichen aus der Captchagrafik unterlaufen ist.
Dazu wird über den Aufruf der Funktion Hole_Eine_Eingabe() aus Captcha.php mit den entsprechenden Übergaben die gewünschte Eingabe ermittelt und dann an entsprechender Stelle in die Variable eingefügt.
Nachdem dieser ganze Anweisungsblock ausgeführt oder übersprungen worden ist wird dann in jedem Fall in gleicher Art und Weise der Inhalt der Variablen (in Captcha.php gesetzt) bei Captcha_Dateiname als Wert gesetzt (ist in der HTML-Eingabeform unsichtbar). Für die Captchagrafik wird das gleiche gemacht, wobei jedoch zusätzlich noch der dabei notwendige (weil im Verzeichnis der temporären Dateien) und die notwendige Datenamenserzweiterung  mit angegeben werden.
In Zeile 71 wird dann der ganze (geänderte) Inhalt der Variablen  in einer temporären Datei gespeichert und sofort in der Zeile 72 mit include eingebunden, so dass diese (geänderte  HTML-Eingabeform-) Seite nun als HTML-Seite im Browser angezeigt wird.
Ich kann nur nochmals die Webseite PHP-Manual empfehlen, auch wenn Sie die Übergaben zum Beispiel in eine Datenbank schreiben wollen.