Captcha mit Text "PHP Captcha"

So geht’s: Eigenes Captcha mit PHP

Du begegnest ihnen auf vielen Websites wenn du im Internet surfst. Sie sind dafür da, um sicherzustellen, dass es sich wirklich um Menschen handelt und nicht Computer, die gerade die Website aufrufen wollen. Ich rede von Captchas.

Neulich habe ich das Kontaktformular von WWW Coding entwickelt und dabei darüber nachgedacht, wie ich Bots aussperren kann: Mit einem Captcha Bild, welches mittels PHP generiert wird.

Ein solches Skript ist nicht schwer und umfasst nur wenige Codezeilen. Ich hatte ursprünglich ein solches Skript auf stoppt-den-spam.info gefunden. Da ich das allerdings etwas zu unübersichtlich fand und weil mir einige Funktionen gefehlt haben, habe ich mein eigenes PHP-Captcha entwickelt und möchte dir diese Version des PHP Captchas vorstellen und hier zum Download anbieten.

Du benötigst ein vollständiges Kontaktformular inklusive Captcha? Dann schau Dir mal diesen Artikel an.

So funktioniert das Captcha

Das Captcha verfügt über ein Hintergrundbild. Das PHP Skript legt darüber einen zufälligen Schriftzug mit 5 Zeichen Länge und in schwarzer Farbe (voreingestellt).

Der Winkel und die genaue Position des Textes variieren zufällig. Um das Captcha besonders sicher zu machen, wird zudem noch eine weitere Grafik mit schwarzen Strichen über das Bild gelegt.

Werbung

Mit dem Aufruf des Captchas wird das Bild auf die oben beschriebene Art und Weise generiert und anschließend ausgegeben. Außerdem speichert PHP den Text, der im Captcha dargestellt wird, in einer Session, damit dieser später leicht wieder abgefragt werden kann.

Per Klick auf das Captcha wird ein neuer Code generiert und das Textfeld geleert. Das funktioniert allerdings nur, wenn der Besucher JavaScript aktiviert hat.

Download des PHP Captchas

Download Button
PHP-Captcha downloaden

Du kannst den Code als ZIP-Datei downloaden. In diesem Archiv findest du verschiedene Dateien, die dir beim Einbau helfen sollen. Hier nun eine kurze Übersicht, die klärt, welche Dateien wofür benötigt werden-

Hinweise zur Verwendung: Der komplette Code und die darin enthaltenen Grafiken dürfen frei verwendet und vervielfältigt werden. Die Schriftart unterliegt einer eigenen Lizenz, die beiliegt.

Wir bitten darum die Urheberhinweise aus den PHP Dateien nicht zu entfernen.

  • captcha.php
    Diese Datei generiert das Captcha und wird also als Bild im Formular aufgerufen. Am einfachsten ist es, wenn du sie zusammen mit den anderen Dateien in einem Verzeichnis lässt.
  • so_gehts.php
    Hier sind alle Codeschnipsel enthalten, die du benötigst, um das Captcha auf deiner Seite einzubinden. Außerdem wird der Einbau Schritt für Schritt beschrieben.
  • railway-webfont.ttf und Railway LICENSE.txt
    Diese Dateien beinhalten die verwendete Schriftart und die Lizenz dieser, die bei einem Download enthalten sein muss. Mit dieser Schriftart wird der Captcha-Text generiert.Möchtest du eine andere verwenden, muss die Variable $font_file  in der captcha.php auf diese verweisen.
  • bg_captcha.png
    Das Hintergrundbild für das Captcha. Du kannst auch bg_captcha_1.png, bg_captcha_2.png, bg_captcha_3.png oder ein anderes Bild in dieser Größe verwenden.  Benenne die gewünschte Grafik dann einfach in bg_captcha.png um oder passe die Variable $captcha_bg_img in der captcha.php an.
  • bg_captcha_over.png
    Das Bild, was über das Captcha gelegt wird. Auch hier werden 2 Alternativen (_1 und _2) mitgeliefert, die stattdessen gewählt werden können. Benenne die gewünschte Grafik in bg_captcha_over.png um oder passe die Variable $captcha_over_img in der captcha.php an.

Tutorial zum Einbinden des Captchas

Damit du das Captcha in deinem Formular verwenden kannst, muss es zunächst eingebunden werden. Du findest dafür ausführliche Hilfen in der so_gehts.php.

Zunächst solltest du das Hintergrundbild auswählen und das Bild, was über den Text gelegt werden soll. Wie oben beschrieben kannst du diese anpassen. Bist du mit beiden Grafiken zufrieden, musst du an dieser Stelle noch keine Veränderungen vornehmen.

Das gleiche gilt für die Schriftart, auch diese Datei kannst du einfach mit dem gleichen ersetzen oder die Einstellungen in der captcha.php anpassen. Am einfachsten ist es, wenn du bei der Schriftart bleibst, die bereits im Download enthalten ist.

Fortgeschrittene Nutzer können übrigens auch die Einstellungen in der captcha.php (die oberen Variablen) anpassen und die Ausgabe so individualisieren

Lade nun alle Dateien in einen Ordner auf deinem Webspace. Zum Beispiel in den Ordner /bilder/captcha, von diesem Pfad werden wir im folgenden Beispiel ausgehen, du kannst aber natürlich auch einen anderen wählen.

Nun musst du das Captcha auch in dein Formular integrieren. Das könnte etwa ein Kontaktformular sein. Dafür muss zum einen das Captcha eingebunden werden, damit der Benutzer weiß, welchen Code er eingeben soll:

<img src="captcha.php?RELOAD=" alt="Captcha" title="Klicken, um das Captcha neu zu laden" onclick="this.src+=1;document.getElementById('captcha_code').value='';" width=140 height=40 />

Zum anderen benötigst du ein Textfeld, mit dem der Code übergeben werden kann. Hier ein Beispiel, wie dies aussehen kann. Wichtig ist dabei nur der Name „captcha_code“, ansonsten kannst du das Textfeld beliebig anpassen.

<input type="text" name="captcha_code" id="captcha_code" size=10 />

Mit dem Absenden deines Formulars muss auf eine PHP-Datei weitergeleitet werden. Zu Beginn dieser PHP-Datei vor jeglicher Ausgabe muss die Session initialisiert werden:

session_start();

Die Überprüfung des Captchas erfolgt anschließend:

// Bearbeiten des Formulars //
if ($_POST['captcha_code'] == $_SESSION['captcha_spam']) {
// Das Captcha wurde korrekt ausgefüllt //

   // [HIER] kann jetzt der PHP-Code hin, den vorher ohnehin genutzt hast, um das Formular zu verarbeiten.

} else {
// Captcha wurde falsch ausgefüllt, Fehler ausgeben. //
echo 'Du hast den Captcha-Code falsch eingegeben!';
}

Damit wird überprüft, ob der Code korrekt war. Ist dies der Fall wird der Code ausgeführt den du anstelle des „[HIER]“-Kommentars platzierst. Dort sollten bei einem Kontaktformular zum Beispiel die anderen Daten überprüft und anschließend eine E-Mail versendet werden.

Ist der Code falsch, wird die Meldung „Du hast den Captcha-Code falsch eingegeben!“ ausgegeben.

Alle diese Ausführungen und Code-Beispiele findest Du auch noch in ZIP-Archiv, welches Du downloaden kannst.

Kleinere Fragen oder Anmerkungen kannst Du mir gerne über die Kommentar-Funktion mitteilen.

Changelog

  • 28.08.2012:
    Die erste Version des Captchas wird veröffentlicht.
  • 24.01.2014:
    Andere Schriftart, die captcha.php kann nun leichter angepasst werden, die so_gehts.php erklärt das Einbinden nun noch einfacher.
  • 08.02.2016:
    Bei einigen Versionen der GD Library kam es zu Problemen mit dem Pfad zur Schrift-Datei. Das Probleme wurden behoben. Danke an Michael für den Hinweis!
  • 17.06.2016:
    Ab sofort wird eine neue Schriftart verwendet. Außerdem kann per Klick auf das Captcha ein neuer Code generiert werden.
Bewerte den Artikel


Werbung

44 Gedanken zu „So geht’s: Eigenes Captcha mit PHP“

  1. Hallo,

    ich habe das Capture so eine gebaut.
    Leider geht der zweite Aufruf meiner Php Datei zum Check nicht.

    Können Sie mir bitte helfen.
    Viele Grüße,
    Annette

    1. Hallo Annette,

      Dein Kontaktformular arbeitet mit JavaScript und lässt den Nutzer das E-Mail Programm aufrufen. Um ein Captcha zu verwenden, musst den Besucher auf eine PHP-Seite weiterleiten und anschließend per PHP die E-Mail verschicken.

      Wenn du dabei Hilfe benötigen solltest, kannst Du mir ja gerne mal eine E-Mail schicken.

      Schöne Grüße

  2. Habe euren php-code etwas geändert:

    // Variablen (können angepasst werden) //
    $zahl1 = rand (0,3); $zahl2 = rand (0,2);
    $captcha_bg_img = ‚bg_captcha_‘.$zahl1.‘.png‘; // Pfad zum Hintergrundbild
    $captcha_over_img = ‚bg_captcha_over_‘.$zahl2.‘.png‘; // Pfad zum Bild, was über das Captcha gelegt wird

    und die bilder
    bg_captcha.png in bg_captcha_0.png
    sowie
    bg_captcha_over.png in bg_captcha_over_0.png

    umbenannt.

    Jetzt wechselt er zufällig alles durch!

    Wär vielleicht ne idee!

    Danke für euer einfaches script!

    1. Danke für deine Anmerkung. Das ist eine interessante Idee, die man auch auf die Hintergrundbilder anwenden könnte, mal sehen, vielleicht werde ich das in der nächsten Version implementieren, ansonsten werden die Leser ja durch deinen Kommentar darüber informiert.

    1. Hallo Rene,

      Das liegt vermutlich daran, dass der Pfad zur ttf-Datei nicht korrekt ist. Rufe die captcha.php doch mal mit aktivierter Fehler-Anzeige auf (error_reporting).

      Schöne Grüße

  3. Hallo zusammen!
    bei mir ist keine Schrift auf dem Bild zu sehen. Woran könnte es liegen?
    Ich habe alles genau so gemacht wie es beschrieben worden ist…:
    TTF datei ligt in dem Ordner Captcha , wo auch alle andere Dateilen liegen.
    Besten Dank,
    Maria

    1. Hallo Maria,

      Kommentiere temporär diese Zeile mal so aus: // imagepng($img);

      Sorge dann dafür, dass die Fehlermeldungen aktiviert sind (z.B. durch diese 2 Zeilen hinter der unset-Zeile ganz oben ini_set('display_errors', 1); und error_reporting(E_ALL);). Anschließend erneut hochladen und mir bitte per E-Mail (siehe Impressum) die Fehlermeldung schicken, die er dann beim Aufruf der captcha.php anzeigt.

      Schöne Grüße

      1. Hallo, Tristan,
        So Meinst du das:?

        session_start();
        unset($_SESSION[‚captcha_spam‘]);
        ini_set(‚display_errors‘);
        error_reporting(E_ALL);

        // Variablen (können angepasst werden) //

        PS wohin mit dem imagepng($img);?

  4. Hallo, ich habe große Probleme, den Code in die index.php mit einer if-Funktion einzubinden. Das Kontaktformular funktioniert und der Captcha wechselt auch den Code. Allerdings wird die Anfrage trotzdem versendet – egal, ob der Captcha genutzt wird.
    Ich würde Dir gern mal die index zum Rüberschauen per Mail schicken.
    Schöne Grüße, Tom

    1. Hallo Tom,

      Du kannst mir gerne einmal die entsprechende Datei schicken. Die Adresse dafür findest du im Impressum.

      Schöne Grüße

    2. Hi,
      bin leider kein vollblut php’ler … ich habe ein Kontakformular und die Abfrage in eine rzweiten php Datei. Habe das captcha soweit in die kontaktform verbaut. Wird geladen tec. Nur eben die Prüfung erfolgt nicht. D.h. die Positionierung der php Abfrage passt nicht. Wo soll sie denn hin? Vor die Eingabe des captcha codes oder in die Auslesedatei? Irgendwie funzt beides nicht so

      1. Hallo Sebastian,

        In der sogehts.php findest du eine Anleitung. Die Captcha-Abfrage sollte (fast) alles andere umschließen. An der Stelle des // Kommentars kannst du dann deinen bisherigen Code einfügen.

        Schöne Grüße & ein frohes neues Jahr

  5. Hallo !!
    Und was mache ich wenn ich keinen Fehler bekomme !?

    Habe auch das Prob das ich keine Zahlen, Buchstaben sehe

    Die Funktion einen Fehler ausgeben zu wollen habe ich eingesetzt und das einzigste was da steht ist dann, wo der Captcha-code steht steht nur das Wort Captcha was er sich aus der alt=“Captcha“ holt … also bekomme ich keine Fehlermeldung
    Gruss Karlheinz

    1. Hallo Karlheinz,

      Schau dir doch mal meine Antwort auf den Kommentar von Maria an. Wichtig ist, dass du das imagepng() auskommentierst und dann die Datei direkt aufrufst, um Fehler angezeigt zu bekommen.

      Schöne Grüße

  6. Oh Tristan … Sorry da hab ich mal den Wald vor lauter Bäume nicht gesehen ….. hatte das script im ganzen immer aufgerufen ;((

    Nun denn habe ich folgenden Fehler zu berichten :
    Die Grafik kann nicht angezeigt werden weil sie Fehler enthält

    Es ist aber eigentlich alles in einem Verzeichnis sodass es eigentlich funktionieren sollte.
    schon komisch ….

    Gruss Karlheinz

    1. Dann hast du inagepng wohl noch nicht auskommentiert 😉

      Mach das mal bitte und schick mir dann eine eMail mit der Fehlermeldung.

      Schöne Grüße

  7. Käfer gefunden, der Pfad zur Font-Datei muss mit Punkt und Slash anfangen:
    $font_file = ‚./DejaVuSans-Bold.ttf‘; // Pfad zur Schriftdatei

    1. Hallo Rob,

      Danke für deinen Kommentar. Da stimmt schon alles. Solange du die Schrift-Datei im gleichen Verzeichnis lässt, ist auch der dort angegebene Pfad korrekt.

      Schöne Grüße

      1. Hallo Tristan,

        richtig, das hätte ich noch bemerken sollen. Jedenfalls hat es bei mir erst nach dieser kleinen Änderung geklappt. Bei anderen Pfadangaben (verwende gewöhnlich Konstanten) gelingen sämtliche Verweise sonst auch ohne den Punkt und Slash.

  8. Hallo Tristan

    Vielen Dank für die Bereitstellung Deines Skriptes. So habe auch ich als Laie es geschafft einen Captcha zu installieren. Nun habe ich aber noch folgendes Problem: Es gibt mir immer noch eine Fehlermeldung aus, wenn ich das Kontaktformular aufrufen lasse:

    Warning: session_start() [function.session-start.php]: Cannot send session cache limiter – headers already sent (output started at /home/ipsrch/www/ipsr.ch/index.php:130) in /home/ipsrch/www/ipsr.ch/kontakt.php on line 4

    In Linie 130 des besagten index.PHP’s steht folgender Befehl:

    Soviel ich verstehe beisst sich das mit dem PHP Aufruf auf der Kontaktseite:

    Könntest Du mir da einen Tipp geben, wie ich diese Fehlermeldung weg machen kann?

    Herzlichen Dank

    Helena

    1. Hallo Elena,

      Deine Zeile 130 kann man nicht sehen. Vor dem session_start() Befehl darf keine einzige Ausgabe erfolgen. Wenn du also in der index.php in Z130 etwas ausgibst und danach die kontakt.php einbindest, dann zieh einfach den session_start() Befehl an den Anfang deiner index.php.

  9. Hallo,
    ist es denn möglich, die Eingabefelder und den Text mittels CSS zu stylen? Ich verwende Bootstrap3 und möchte natürlich das Aussehen auf der Kontaktseite wie auf den anderen Seiten.
    Vielen Dank!

  10. Hallo,
    habe heute leider feststellen müssen das Captcha funktioniert unter PHP 5.4 nicht mehr richtig (Captcha Schrift im Bild wird nicht mehr angezeigt). Gibt es hierfür vielleicht eine Lösung?

    1. Hallo Ringo,

      Das wird nicht an PHP 5.4 liegen. Wie du hier sehen kannst, hat sich an den verwendeten Funktionen nichts verändert. Stelle bitte sicher, dass die Schriftdatei auch unter dem angegebenen Pfad zu erreichen ist, dann sollte es zu keinen Problemen kommen.

      Schöne Grüße

  11. Hallo Tristan,
    habe alles nach Anleitung in das Kontaktformular unserer homepage eingefügt, leider scheint jedoch die Einbindung der captcha.php nicht zu funktionieren. Es wird weder ein Hintergrundbild, noch das überlappende Bild, noch ein Schriftzug ausgegeben.
    Für einen Hinweis wäre ich dankbar.
    Viele Grüße
    Georg

    1. Hallo Georg,

      Bitte stelle sicher, dass die GD Library auf deinem Webspace/Server installiert ist, und du die Datei nicht so abgeändert hast, dass es zu Fehlern kommt. Unter Umständen kann es auch schon reichen, die Datei in dem falschen Editor abzuspeichern, wenn ein (unsichtbares) Leerzeichen vor der Ausgabe hinzugefügt wird.

      Beste Grüße
      Tristan

  12. Tolles Script …
    Eine Frage?

    Wo/Wie geht das, für eine „refresh“ … um den captcha code neu zu laden, ohne die Webseite neu laden zu müssen.

    1. Hallo Markus,

      mit der neuen Version des Captchas, kannst du einfach auf das Bild klicken, um ein neues Captcha zu laden. Javascript muss dafür aktiviert sein.

  13. Hallo zusammen, ich habe das Script entdeckt, Und möchte es sehr gerne in mein Formular einbinden. Irgendwie stelle ich mich zu dämlich an 🙁

    <?php
    session_start();

    if ($_POST['captcha_code'] == $_SESSION['captcha_spam']) {

    echo 'Kontaktformular‘;
    if ( $_POST[‚abgesendet‘] ==“ja“)
    {
    echo ‚Bitte beide Felder ausfüllen‘;
    }

    echo “;

    echo ‚E-Mail-Adresse‘;
    echo “;

    echo ‚Ihre Nachricht‘;
    echo “;
    echo $_POST[‚anliegen‘];
    echo “;

    echo “;
    echo “;
    echo “;

    } else {
    // Captcha wurde falsch ausgefüllt, Fehler ausgeben. //
    echo ‚Du hast den Captcha-Code falsch eingegeben!‘;
    }

    ?>

    Bei sieht es so aus. Und als resultat bekomme ich immer angezeigt, das der Cptcha Code als angegeben ist ohne jegliches Formular. Vllt. könnt ihr mir ja auf die Sprünge helfen? Danke schonmal im Voraus. Gruß Enrico

    1. Hallo Enrico,

      du kannst dich gerne einmal bei mir per Email unter der im Impressum angegebenen Adresse melden, die Datei anhängen und das Problem noch einmal genau beschreiben.

      Beste Grüße
      Tristan

  14. Hey,

    ich habe das Problem, dass ich wenn ich das Captcha nicht eingebe, lediglich auf eine leere Seite komme, statt den Error zu sehen. Woran könnte das liegen?

    1. Hallo Sebastian,

      das kann je nach Server-Einstellungen unter anderem dann passieren, wenn du einen Fehler im Code hast. Dann wird aber jeder Aufruf der Datei (auch Anzeigen des Formulars) fehlschlagen.

      Womöglich gibst du auch keine Inhalte an dieser Stelle aus oder deine if-Abfrage enthält einen Fehler.

  15. Hallo Tristan,
    erstmal ein rissen kompliment, das Du dich den problemen so animmst und rede und antwort gibst.
    Das Skript ist echt genial, sehr einfach. Hat auch gleich funktioniert.
    Habe dennoch eine frage, vielleicht kannst Du mir einen Tip geben.
    Ich wollte das Script in einer Login funktion einbringen. Allerdins sollte das Script bei den ersten zwei versuchen nicht erscheinen. Beim 3 Login versuch soll zusätzlich Captcha erscheinen.
    Wenn ich jetzt in einer bedingung den Code von die einsetze ist ja in der anweisung einmal das vorhanden und andersmal nicht. Jetzt habe ich eine Fehlermeldung in meiner abfrage, da das $_POST[‚captcha_code‘] es ja ganicht gibt.

    Hast Du eine Idee? Vielen Dank für Dein Bemühen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.