Captcha mit Text "PHP Captcha"

So geht’s: Eigenes Captcha mit PHP

Du begegnest ihnen auf vielen Websites, wenn du im Internet surfst. Sie sollen sicherstellen, dass es sich wirklich um Menschen handelt und nicht um 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.

Das Captcha ist insbesondere eine Alternative für diejenigen, die aus Datenschutz-Gründen nicht auf Googles ReCaptcha zurückgreifen möchten.

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 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.

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.

Technische Voraussetzungen

Damit das Captcha korrekt generiert werden kann, muss die PHP GD Bibliothek auf eurem Server installiert sein.

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.

Tipp für Fortgeschrittene: Zusätzlich bietet es sich an, ein per CSS verstecktes Formularfeld mit dem Namen „email“ anzulegen und das Formular nur dann zu verarbeiten, wenn das Feld leer geblieben ist. Einige Bots werden auch dieses versteckte Feld ausfüllen.

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.
  • 16.04.2019:
    Verwechslungsgefährdete Zahlen und Buchstaben (0, 1, O, I) sind nun ausgeschlossen. Im Übrigen gab es kleinere Optimierungen.

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

    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. Guten Tag Tristan
      Superlösung von dir, bin begeistert. Das Kontaktformular funktioniert perfekt. Was bei mir nicht funktioniert, ist einzig das Bestätigungsmail an die eigene Adresse (sofern Häkchen entsprechend gesetzt). Ich erhalte dieses Bestätigungsmail leider nicht. Woran kann dies liegen? Für einen Tipp wäre ich dir sehr dankbar. Vielen Dank und freundliche Grüsse Jürg

      1. Guten Tag Tristan
        Superlösung von dir, bin begeistert. Das Kontaktformular funktioniert perfekt. Was bei mir nicht funktioniert, ist einzig das Bestätigungsmail an die eigene Adresse (sofern Häkchen entsprechend gesetzt). Ich erhalte dieses Bestätigungsmail leider nicht. Woran kann dies liegen? Für einen Tipp wäre ich dir sehr dankbar. Vielen Dank und freundliche Grüsse Jürg
        Habe leider bis heute keine Antwort erhalten

        1. Hallo, hatte ähnliches Problem, nachdem ich das Skript angepasst habe und den Text von ‚gesetzt‘ auf ‚Ja‘ gesetzt habe in diese Block…

          case ‚checkbox‘:
          case ‚_copy‘:
          case ‚_consent‘:
          …. value=\“gesetzt\“

          Habe im Slript eine weitere Stelle gefunden wo das relevant ist.. auch hier habe ich das ‚gesetzt‘ durch das gleichlautende ‚Ja‘ ersetzt und dann klappte es…
          // E-Mail Kopie verschicken //
          if ($settings[0] == ‚_copy‘ && $_POST[$fname] == ‚Ja‘) {
          $mailCopy = true;

  1. 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.

    2. Hallo Bernd,
      eigentlich sollte es ganz einfach sein diese Codezeilen anzupassen, leider klappt es bei mir nicht. Ich habe die Zeile

      $zahl1 = rand (0,3); $zahl2 = rand (0,2);

      hinzugefügt und die Zeilen

      $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

      ersetzt.
      Die Dateinamen habe ich auch abgeändert. Trotz allem wird kein Captcha angezeigt (Kein Bild und kein Text). Das unveränderte Script funktioniert.

      Dein Kommentar ist nun schon einige Jahre alt. Kann es sein, dass die Veränderungen nicht mehr zu dem aktuellen Script passen?

      Hast Du evtl. eine Idee?
      Gruß Mike

      1. Hallo Bernd,
        Kommando zurück, ich habe den Fehler gefunden. Es lag an den Anführungszeichen. So funktioniert es bei mir:

        // 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

        Cheers – Mike

    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

  2. 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);?

  3. 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. 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

  4. 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

  5. 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

  6. 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.

  7. 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.

  8. 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!

  9. 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

  10. 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

  11. 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.

  12. 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

  13. 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.

  14. 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

  15. Hallo Tristan,
    vielen Dank für Deinen Captcha-Code und Deinen Support!

    Bei mir funktioniert das Captcha wunderbar, ich würde aber gerne noch erreichen, dass das Captcha nach dem Senden der Anfrage direkt neu geladen wird. Kann ich das irgendwie über ein „onclick“ erreichen?

    Gruß M.

    1. Hallo Mike,

      Unabhängig davon, wie sinnvoll das ist, wenn das Captcha nach dem Abschicken ggf. ohnehin erneut geladen wird, kannst du dir einmal „onsubmit“ anschauen und damit ggf. die Bild-src so verändern, dass es neu geladen wird.

  16. Eine Frage:
    Wenn das Captcha nur als Bild dargestellt wird, ist es nicht barrierefrei, oder? Gibt es eine Möglichkeit das Captcha für Screenreader lesbar und für Bots trotzdem nicht lösbar zu machen?

    1. Hallo Joshua,

      Bots können grundsätzlich alles lesen, was auch Screenreader lesen können. Daher ist mir eine solche Lösung leider nicht bekannt.

  17. Hallo, ich verwende getrennte Dateien für das Formular und das Formular-PHP-Script. Also das Formular als solches ist eine reine HTML-Datei, in welchem die Felder definiert sind. Das bisherige Script, welches die Formularfelder ausliest, wird mit

    aufgerufen.
    Wie kann ich denn nun das Captcha einbinden? Ich möchte ja das vorhandene Formular gerne weiternutzen, lediglich um Capcha erweitert.
    Kann ich dir die zu ändernden Dateien per E-Mail schicken?

    1. Hallo Matthias,

      In dem Fall musst du die Datei aus der Anleitung selbständig aufteilen. Ich kann leider derzeit keine individuellen Hilfestellungen anbieten.

      Beste Grüße

  18. Hallo Tristan,
    Dein Cpcha hat jahrelang bestens funktioniert, danke!

    Jetzt hat mein Provider PHP auf die aktuelle Version 7.1 umgestellt (bisher 5.6), und es wird kein Bild mehr erzeugt. GD ist weiterhin installiert. Gibt es da eine einfache Abhilfe außer 5.6 weiter zu benutzen?
    Danke schon mal

    Claus

    1. Hallo Claus,

      PHP 7.1 bringt an sich keine wesentlichen Änderungen für Sessions und die GD-Bibliothek mit sich, die die Captcha-Erstellung beeinträchtigen könnten.

      Du kannst dir mit ini_set(‚display_errors‘, 1); error_reporting(E_ALL); in der captcha.php Fehler anzeigen lassen und mir diese gerne per Email mitteilen.

  19. Hallo Tristan,
    mit php7.2 wird $_SESSION[‚captcha_spam‘] nicht mehr an mein Script uebergeben.
    Ich hoste bei strato und sobald ich in die .htaccess ein „AddType application/x-httpd-php56 .php“ in die erste Zeile setze, funktionierts (noch – bis Maerz 2019).
    Vielleicht muss ich auch auf dein Captcha hier zurueckgreifen, das du hier im Formular verwendest „1/1“ 🙂
    LG, Heiko

    1. Hallo Heiko,

      auch bei PHP 7.1/7.2 sollte es keine wesentlichen Änderungen geben (nur geringfügig, zB für den Rückgabewert von session_start()).

      Auch du kannst dir mit ini_set(‚display_errors‘, 1); error_reporting(E_ALL); in der captcha.php Fehler anzeigen lassen und mir diese gerne per Email mitteilen.

  20. Hallo Tristan

    Danke für das Captcha.
    Ich habe zusätzlich die Y-Position und den Schriftwinkel Zufalls-gesteuert.

    <?php
    /* PHP-Captcha von: http://www-coding.de
    * Tutorial Artikel: http://www-coding.de/so-gehts-eigenes-captcha-mit-php/
    */

    session_start();
    unset($_SESSION['captcha_spam']);

    // Variablen (können angepasst werden) //
    $captcha_bg_img = 'bg_captcha.png'; // Pfad zum Hintergrundbild
    $captcha_over_img = 'bg_captcha_over.png'; // Pfad zum Bild, was über das Captcha gelegt wird
    $font_file = dirname(__FILE__).'/railway-webfont.ttf'; // Pfad zur Schriftdatei
    $font_size = 25; // Schriftgröße
    //$text_angle = mt_rand(0, 5); // Schriftwinkel 1. Zeichen (Werte zwischen 0 und 5)
    $text_x = mt_rand(8, 11); //0,18 // X-Position 1. Zeichen (Werte zwischen 8 und 11)
    //$text_y = 35; // Y-Position 1. Zeichen
    $zeichenAbstand = 25; // Abstand zwischen den Zeichen
    $minAngle = -35; // minimaler (negativer) Schriftwinkel
    $maxAngle = 35; // maximaler Schriftwinkel
    $minY = 30; // minimale Y-Position
    $maxY = 38; // maximale Y-Position
    $text_chars = 5; // Länge des Textes
    $text_color = array(0, 0 , 0); // Textfarbe (R, G, B)

    // Funktion um zufälligen String zu generieren //
    function rand_string($length=5) {
    $str = array_merge(range('A', 'Z'), range(1, 9));
    for ($i = 1; $i <= (count($str)*2); $i++) {
    $swap = mt_rand(0,count($str)-1); $tmp = $str[$swap]; $str[$swap] = $str[0]; $str[0] = $tmp;
    }
    return substr(implode('', $str),0,$length);
    }

    // Zufälligen Text generieren und in der Session speichern //
    $text = rand_string($text_chars);
    $_SESSION['captcha_spam'] = $text; //der vorgegebene captcha Text

    // Header: Mitteilen, dass es sich um ein Bild handelt und dass dieses nicht im Cache gespeichert werden soll //
    header('Expires: Mon, 26 Jul 1990 05:00:00 GMT');
    header("Last-Modified: ".date("D, d M Y H:i:s")." GMT");
    header('Cache-Control: no-store, no-cache, must-revalidate');
    header('Cache-Control: post-check=0, pre-check=0', false);
    header('Pragma: no-cache');
    header('Content-type: image/png');

    //zufälliges Bild auswählen
    $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

    //zufällige y-Position und Drehung generieren
    $yPosAr = Array(5);
    $angleAr = Array(5);
    $textAr = Array(5);
    $textX_Ar = Array(5);
    for ($i=0; $i < 5; $i++)
    {
    $yPosAr[$i] = rand($minY, $maxY);
    $angleAr[$i] = rand($minAngle, $maxAngle);
    $textAr[$i] = substr($text, $i, 1);
    $textX_Ar[$i] = $text_x + ($i*$zeichenAbstand);
    }

    // Captcha Bild erstellen, Text schreiben & Bild darüber legen //
    $img = ImageCreateFromPNG($captcha_bg_img);
    $text_color = ImageColorAllocate($img, $text_color[0], $text_color[1], $text_color[2]);
    for ($j=0; $j

  21. Hallo Tristan,

    gibt es eine Möglichkeit den fünf stelligen captcha Wert, der in der Variable $_SESSION[‚captcha_spam‘] gespeichert ist, in eine Javascript Variable zu übergeben?

    Grüße
    Joachim

  22. Hallo Tristan,
    habe das Formular mit Captcha getestet und es gefällt mir gut. Als Bestandteil eines Joomla-Views bekommen ich es jedoch nicht zum Laufen, da hier die Session-Technik nicht funktioniert. Gibt es eine Joomla-Variante?

    Danke und Gruß
    Klaus

  23. Hallo Tristan

    Herzlichen Dank für den Code.
    Bin gerade auf einen neuen Server umgezogen, wo es zuerst nicht mehr lief. D.h. die Bildchen wurden nicht mehr korrekt generiert (es gab jeweils ein Linefeed zuviel am Anfang eines png-Bilds).
    Folgendes hat Abhilfe geschaffen:

    ob_end_clean();

    Diese Zeile hab ich nach „unset($_SESSION…“ eingefügt (k.A. ob es genau dort hin muss). Jetzt tut’s wieder :-).

    Gruss, Silvan

    1. Hallo Silvan,

      danke für deine Anmerkung! Die sauberere Lösung sollte darin bestehen, dass keinerlei Leerzeichen vor dem PHP-Tag in der ersten Zeile auftauchen und die Datei als UTF-8 ohne BOM gespeichert wird.

  24. Vielen Dank für den PHP-Code und die Tipps. Ich habe Neuland betreten und das Captcha nach 12 Stunden Arbeit zum Laufen gebracht. Danke auch an die Hilfe der Kommentatoren.

  25. Hallo Tristan das tönt sehr gut. Ich habe auch schon dies und das aus dem Web als html Code in meine Webseite übernommen. Die Webseite habe ich selber gemacht, damals mit Frontpage, heute mit Microsoft Expression Web 4.0. Mein Kontaktform hat mir ein Freund vor Jahren in PHP geschrieben. Mittlerweilen gehen immer mehr Spam Kommentare ein.
    Ich habe keine Grundlagenkenntnisse, ausser vor vielen Jahren ein Kurs zu Frontpage.
    Ich komme mit Deiner Anleitung nicht zurecht. Es ist ja nicht ein ganzer Block den ich übernehmen soll, sondern einzelne Zeilen von denen ich entscheiden muss, wo ich die hinkopiere. Kannst Du mir dazu etwas weiterhelfen. Gehören die Capthca Zeilen in eine leere Zeile oder muss ich eine bestehende Zeile duplizieren? Kannst Du mir ein bisschen mehr Anleitung geben.
    Gruss Heinz
    Heinz

  26. Hi, nachdem bei diesem Captcha ja auch Session verwendet wird, sind das dann quasi Cookies? Ich verwende das derzeit noch nicht und brauch daher auch kein Popup beim Start der Webseite. Müsste ich das dann einbauen?

    1. Hi Chris,

      das ist tatsächlich etwas komplizierter. Nach jetzigem Stand wird kommt es wohl darauf an, ob das Cookie unbedingt notwendig ist für essentielle Funktionen der Website.

      Das kann man bei einem Captcha-Cookie gut argumentieren. Du solltest in jedem Fall in deiner Datenschutz-/Cookie-Erklärung auf den Cookie inkl. Name und Laufzeit (idR Browser-Sitzung) hinweisen.

  27. Hallo Tristan, ich habe mir das Captcha in den Login eingebau. Doch ich erhalte immer die Fehlermeldung „Notice: Undefined index: captcha_spam in F:\xampp\htdocs\Session\Login_Check.php on line 20“

    Was muss ich machen, dass das endlich funktioniert?

    1. Hallo Joel,

      Es handelt sich dabei nur um einen unbedenklichen Hinweis, wenn du das Skript korrekt eingebaut hast. Du kannst vorher isset() verwenden, um zu prüfen, ob die Variable gesetzt wurde. Andernfalls kannst du die Fehlermeldungen (error_reporting) deaktivieren.

  28. Das Problem bei dieser Art von CAPTCHA ist, das heutzutage erhältliche Browser-Plugins diese mühelos lösen können und die Usability darunter sehr leidet. Unsere Alternativen die demnächst online geht wäre RobotCaptcha. Der Vorteil liegt hierbei in der Datenschutz Sicherheit da wir keinerlei Daten weiter verwenden außer zu Validierung.

  29. DANKE! DANKE! DANKE!

    für dieses einfach einzubindende und nützliche Tool. Damit muss ich kein gCaptcha nutzen in meinem kleinen Formular. 🙂

  30. Hallo zusammen,
    ich würde gerne die Einträge in einer SQL Datenbank speichern nach Eingabe.
    Er fügt auch eine Zeile ein, aber die Felder bleiben leer.
    Mit welcher Variable kann ich die einzelnen Einträge zu ordnen? So funktioniert es leider nicht:
    $nachname = $_POST[‚Nachname‘];
    $neutn = mysql_query(„INSERT INTO info (id, nachname) VALUES (“, ‚$nachname“‘)“);
    Vielen Dank für eure Hilfe.
    Christian

  31. Ich möchte gern noch 2 Datumsfelder in das Formular einbauen. In den Felder sollte sich dann ein kleiner Kalender öffnen
    und das jeweils ausgewählte Datum so ins Formular mit übernommen werden. Benötige ich zum erstellen eines Anfang und Enddatums einer Veranstaltung.
    ist das möglich?

  32. Hallo, erst mal danke für das tolle Tutorial und den Code. Habe das Formular schon lange auf meiner Seite.
    Plötzlich funktioniert es aber nicht mehr. Bei jedem Sendeversuch wird abgebrochen mit der Meldung „Es ist ein Fehler aufgetreten: Es wurden nicht alle Felder korrekt ausgefüllt.“ – und das, obwohl alle Felder definitiv korrekt ausgefüllt sind.
    Woran kann das liegen?