Inzwischen haben wir alle Captcha -Bilder in Online -Formularen begegnet. Captchas ist ein notwendiges Übel, und dieser Artikel wird Ihnen beibringen, wie sie gemacht werden.
Bitte beachten Sie, dass es zwar bessere automatische Lösungen von Drittanbietern für Captchas gibt, wie z. Wir werden nicht erklären, was Captchas tatsächlich sind, da es als allgemein bekannt ist und an anderer Stelle bereits detaillierter behandelt wird.
Sie müssen die GD -Bibliothek (Graphics Draw) vor dem Fortfahren installiert haben. Diese Bibliothek ermöglicht das Zeichnen von Grafiken und Bildern durch integrierte PHP-Funktionen. Um es zu installieren, führen Sie sudo apt-Get-Installieren Sie PHP5-GD aus oder befolgen Sie die Anweisungen.
Captchas bestehen normalerweise aus 3 Dingen - Form, Verzerrung und Text.
Wir werden die unten genannten Schritte befolgen:
Zeigen Sie ein leeres Bild an
<span><span><?php </span></span><span><span>session_start(); </span></span><span><span>?></span> </span> <span><span><span><title</span>></span>demo.php<span><span></title</span>></span> </span> <span><span><span><body</span> <span>style<span>="<span>background-color:#ddd; </span>"</span></span>></span> </span> <span><span><?php </span></span><span> <span>create_image(); </span></span><span> <span>display(); </span></span><span> <span>/***** definition of functions *****/ </span></span><span> <span>function display() </span></span><span> <span>{ </span></span><span> <span>?></span> </span> <span><span><span><div</span> <span>style<span>="<span>text-align:center;</span>"</span></span>></span> </span> <span><span><span><h3</span>></span>TYPE THE TEXT YOU SEE IN THE IMAGE<span><span></h3</span>></span> </span> <span><span><span><b</span>></span>This is just to check if you are a robot<span><span></b</span>></span> </span> <span><span><span><div</span> <span>style<span>="<span>display:block;margin-bottom:20px;margin-top:20px;</span>"</span></span>></span> </span> <span><span><span><img</span> src<span>="image.png"</span>></span> </span> <span><span><span></div</span>></span> </span> //div1 ends <span><span><span></div</span>></span> //div2 ends </span> <span><span><?php </span></span><span> <span>} </span></span><span> </span><span> <span>function create_image() </span></span><span> <span>{ </span></span><span> <span>$image = imagecreatetruecolor(200, 50); </span></span><span> <span>imagepng($image, "image.png"); </span></span><span> <span>} </span></span><span> </span><span> <span>?></span> </span> <span><span><span></body</span>></span> </span><span><span><?php </span></span><span><span>?></span></span>
Die Funktion display () hat nichts anderes als einen normalen HTML -Code, der ein Bild im Browser anzeigt. Davon abgesehen wird nur ein Styling durchgeführt, damit die Ausgabe präsentierbar aussieht.
In der Funktion create_image () wird eine Variable verwendet, um das von der ImageCrreatReEcolor () -Funktion zurückgegebene Bild zu verweisen, das die Breite und Länge des Bildes als Argumente nimmt. ImagePng () erstellt ein PNG -Bild des angegebenen Namens und Pfades (im selben Verzeichnis).
Ein schwarzes Bild ist die Ausgabe nach unserem ersten Schritt.
Beachten Sie, dass das Funktionsbildpng () die letzte Zeile unserer Funktion ist und alle folgenden Schritte nur vor diesem Funktionsaufruf in die Funktion create_image () eingefügt werden sollen, sonst würden sie nicht wirksam werden.
Jede Form kann für die Captcha ausgewählt werden. Wir wählen ein Rechteck mit der von Funktionsage gefüllten Funktion () aus. Es dauert fünf Argumente-Bildreferenz, Start X-Pos, Start von Y-Pos, Ende X-Pos, enden Y-Pos und die Hintergrundfarbe. Sie können die entsprechende Funktion für eine Ellipse zur Erzeugung von elliptischen Captcha verwenden.
Die Funktion von ImageColorAlleCocce () verteilt eine Farbe einer Variablen, da sie die RGB -Kombination der Farbe als Argumente nimmt. Der folgende Code ist in der Funktion create () hinzugefügt.
<span><span><?php </span></span><span><span>session_start(); </span></span><span><span>?></span> </span> <span><span><span><title</span>></span>demo.php<span><span></title</span>></span> </span> <span><span><span><body</span> <span>style<span>="<span>background-color:#ddd; </span>"</span></span>></span> </span> <span><span><?php </span></span><span> <span>create_image(); </span></span><span> <span>display(); </span></span><span> <span>/***** definition of functions *****/ </span></span><span> <span>function display() </span></span><span> <span>{ </span></span><span> <span>?></span> </span> <span><span><span><div</span> <span>style<span>="<span>text-align:center;</span>"</span></span>></span> </span> <span><span><span><h3</span>></span>TYPE THE TEXT YOU SEE IN THE IMAGE<span><span></h3</span>></span> </span> <span><span><span><b</span>></span>This is just to check if you are a robot<span><span></b</span>></span> </span> <span><span><span><div</span> <span>style<span>="<span>display:block;margin-bottom:20px;margin-top:20px;</span>"</span></span>></span> </span> <span><span><span><img</span> src<span>="image.png"</span>></span> </span> <span><span><span></div</span>></span> </span> //div1 ends <span><span><span></div</span>></span> //div2 ends </span> <span><span><?php </span></span><span> <span>} </span></span><span> </span><span> <span>function create_image() </span></span><span> <span>{ </span></span><span> <span>$image = imagecreatetruecolor(200, 50); </span></span><span> <span>imagepng($image, "image.png"); </span></span><span> <span>} </span></span><span> </span><span> <span>?></span> </span> <span><span><span></body</span>></span> </span><span><span><?php </span></span><span><span>?></span></span>
Das vorherige Bild ist nach diesem Schritt weiß.
Jetzt beginnen wir tatsächlich damit, den Verzerrungsteil des Captcha zu machen. In PHP werden die Linien vom Startpunkt (x1, y1) bis zum Endpunkt (x2, y2) erzeugt. Wenn wir möchten, dass unsere Linien beide Enden der Box berühren, werden wir die Koordinaten
<span>$background_color = imagecolorallocate($image, 255, 255, 255); </span><span>imagefilledrectangle($image,0,0,200,50,$background_color);</span>
Die Funktion "ImageLine () nimmt in dieser Reihenfolge die Koordinaten X1, X2, Y1, Y2 als Argumente ab, abgesehen von der Bildreferenz und Farbe der Linie. Die Linienfarbe wurde genauso zugewiesen, als die Hintergrundfarbe im vorherigen Schritt zugewiesen wurde.
Das y-Koordinate wird als Rand ()*P angegeben, da dies die Höhe unserer Box ist und immer einen Wert unter 50 zurückgibt. Sie können alternativ Rand (0,50) verwenden. Sie ergeben den gleichen Ausgangsbereich.
zufällige Punkte werden genauso generiert wie zufällige Zeilen. Die verwendete Funktion ist Imagesetpixel (). Diese Funktion nimmt den Wert der Koordinaten auf, bei denen der Punkt in die Box platziert wird.
<span>$line_color = imagecolorallocate($image, 64,64,64); </span><span>for($i=0;$i<10;$i++) { </span> <span>imageline($image,0,rand()%50,200,rand()%50,$line_color); </span><span>}</span>
Das X-Koordinate wird zufällig mit Rand ()* 0 generiert, da dies die Breite unserer Box ist und dies immer einen Wert unter 200 zurückgibt. Sie können alternativ Rand (0.200) verwenden. Sie ergeben den gleichen Ausgangsbereich. Die Y -Koordinate wird wie in den Zeilen Schritt erzeugt.
Wir verweisen zufällig auf eine Position in der Zeichenfolge (die das Alphabet sowohl im unteren als auch im oberen Fall enthält) und weisen die Variable $ bild
zu<span><span><?php </span></span><span><span>session_start(); </span></span><span><span>?></span> </span> <span><span><span><title</span>></span>demo.php<span><span></title</span>></span> </span> <span><span><span><body</span> <span>style<span>="<span>background-color:#ddd; </span>"</span></span>></span> </span> <span><span><?php </span></span><span> <span>create_image(); </span></span><span> <span>display(); </span></span><span> <span>/***** definition of functions *****/ </span></span><span> <span>function display() </span></span><span> <span>{ </span></span><span> <span>?></span> </span> <span><span><span><div</span> <span>style<span>="<span>text-align:center;</span>"</span></span>></span> </span> <span><span><span><h3</span>></span>TYPE THE TEXT YOU SEE IN THE IMAGE<span><span></h3</span>></span> </span> <span><span><span><b</span>></span>This is just to check if you are a robot<span><span></b</span>></span> </span> <span><span><span><div</span> <span>style<span>="<span>display:block;margin-bottom:20px;margin-top:20px;</span>"</span></span>></span> </span> <span><span><span><img</span> src<span>="image.png"</span>></span> </span> <span><span><span></div</span>></span> </span> //div1 ends <span><span><span></div</span>></span> //div2 ends </span> <span><span><?php </span></span><span> <span>} </span></span><span> </span><span> <span>function create_image() </span></span><span> <span>{ </span></span><span> <span>$image = imagecreatetruecolor(200, 50); </span></span><span> <span>imagepng($image, "image.png"); </span></span><span> <span>} </span></span><span> </span><span> <span>?></span> </span> <span><span><span></body</span>></span> </span><span><span><?php </span></span><span><span>?></span></span>
Wenn es in eine Schleife gelegt wird, sieht es so aus-
<span>$background_color = imagecolorallocate($image, 255, 255, 255); </span><span>imagefilledrectangle($image,0,0,200,50,$background_color);</span>
Wir werden die Zeilen
erklären<span>$line_color = imagecolorallocate($image, 64,64,64); </span><span>for($i=0;$i<10;$i++) { </span> <span>imageline($image,0,rand()%50,200,rand()%50,$line_color); </span><span>}</span>
im nächsten Abschnitt.
Die Funktion Imagestring () schreibt den Text in unserem Bild. Es hat 6 Argumente:
Sie können auch den Funktionsfunktionsettftext () verwenden, wenn Sie eine größere Schriftart und einen anderen Schriftart -Stil haben möchten. Es braucht 2 zusätzliche Argumente für den Winkel- und Schriftstil des Textes.
Berechnung der X-Koordinaten erfolgt durch Inspektion. Ungefähr 35 Pixel (5 ($ I*30)) sind die Buchstaben, wobei $ i = 0,1,2,3,4,5,6 $ i = 0,1,2,3,4,5,6 ist. Dies liegt daran, dass wenn wir diesen Wert etwa 15-20px gehalten hätten, es eine Möglichkeit gegeben hätte, dass sich zwei Buchstaben überlappten. Wenn der Wert mehr als 40px gewesen wäre, hätten die Buchstaben insgesamt nicht in die Box gepasst.
Dies erzeugt einen 6 Alphabet Captcha -Text. Wir können immer mehr Zufälligkeit schaffen, indem wir die Aspekte ändern, die aufgrund der Einfachheit, wie Farbe, Y-Koordinaten usw. konstant gehalten wurden
Die letzte Captcha sieht so aus
Mehr Zufälligkeit kann erreicht werden, indem Designs mit den Pixeln erstellt oder die Farbe oder Größe geändert werden.
Die beiden Zeilen, die in den vorherigen Code -Snippets ungeklärt sind, kommen jetzt ins Spiel:
Es werden zwei Einreichungsschaltflächen verwendet, eine zum Senden der Zeichenfolge und eine andere, um die Seite zu aktualisieren.
Die folgenden Zeilen werden zwischen den beiden Abschluss -Div -Tags hinzugefügt (siehe Kommentare in der vorherigen Anzeige ())
<span><span><?php </span></span><span><span>session_start(); </span></span><span><span>?></span> </span> <span><span><span><title</span>></span>demo.php<span><span></title</span>></span> </span> <span><span><span><body</span> <span>style<span>="<span>background-color:#ddd; </span>"</span></span>></span> </span> <span><span><?php </span></span><span> <span>create_image(); </span></span><span> <span>display(); </span></span><span> <span>/***** definition of functions *****/ </span></span><span> <span>function display() </span></span><span> <span>{ </span></span><span> <span>?></span> </span> <span><span><span><div</span> <span>style<span>="<span>text-align:center;</span>"</span></span>></span> </span> <span><span><span><h3</span>></span>TYPE THE TEXT YOU SEE IN THE IMAGE<span><span></h3</span>></span> </span> <span><span><span><b</span>></span>This is just to check if you are a robot<span><span></b</span>></span> </span> <span><span><span><div</span> <span>style<span>="<span>display:block;margin-bottom:20px;margin-top:20px;</span>"</span></span>></span> </span> <span><span><span><img</span> src<span>="image.png"</span>></span> </span> <span><span><span></div</span>></span> </span> //div1 ends <span><span><span></div</span>></span> //div2 ends </span> <span><span><?php </span></span><span> <span>} </span></span><span> </span><span> <span>function create_image() </span></span><span> <span>{ </span></span><span> <span>$image = imagecreatetruecolor(200, 50); </span></span><span> <span>imagepng($image, "image.png"); </span></span><span> <span>} </span></span><span> </span><span> <span>?></span> </span> <span><span><span></body</span>></span> </span><span><span><?php </span></span><span><span>?></span></span>
Bevor Sie sich weiter bewegen, müssen wir wissen, wann wir angezeigt werden müssen und wann das Eingabefeld nicht angezeigt werden soll. Es wird nur
angezeigtDie erste Bedingung wird durch die Verwendung eines $ -Flags erfüllt, das bei jedem Klicken auf "1" auf "1" eingestellt ist. Anfangs wurde es auf einen anderen Wert eingestellt. Die zweite Bedingung wird erreicht, indem überprüft wird, ob der in unserer Sitzungsvariablen gespeicherte Wert mit der Benutzereingabe übereinstimmt (siehe Code unten).
Um dies zu erreichen, werden wir die folgenden Zeilen unseres Startschritts zu Beginn des Artikels ersetzen:
<span>$background_color = imagecolorallocate($image, 255, 255, 255); </span><span>imagefilledrectangle($image,0,0,200,50,$background_color);</span>
mit:
<span>$line_color = imagecolorallocate($image, 64,64,64); </span><span>for($i=0;$i<10;$i++) { </span> <span>imageline($image,0,rand()%50,200,rand()%50,$line_color); </span><span>}</span>
Beachten Sie, dass die Funktionen create_image () und display () nur gemäß den 2 oben diskutierten Bedingungen aufgerufen werden.
Wir benötigen die Sitzungsvariable von der vorherigen Seite, sodass die Sitzung hier nicht zerstört wird. Die Sitzung wird automatisch zerstört, sobald das Browserfenster geschlossen ist.
Die Captcha sieht so aus-
Wenn die Eingabe falsch ist, wird der Benutzer erneut aufgefordert.
Wenn die Eingabe korrekt ist, wird der Benutzer eine Nachricht angezeigt.
Es gibt eine geringfügige Einschränkung - Wenn der Benutzer die Rücktaste zurückdrückt, wird jedes im Cache des Browsers vorhandene Bild nicht neu geladen, während die Seite dies tut. In einer Postanforderung wird die Browser -Back -Schaltfläche eine Seite "Dokument abgelaufen" angezeigt. Wenn die Anfrage jedoch abgerufen wird, wird das Bild nicht regeneriert.
Die Lösung ist einfach - jedes Mal eindeutige Namen von Bildern zu erstellen, damit der Browser sie nicht im Cache findet. Wir werden eine eindeutige Zeichenfolge anhängen, die uns durch die integrierte Time () -Funktion zum Bildnamen beim Erstellen und Anzeigen im Browser an uns zurückgegeben wird.
Fügen Sie diese Zeile direkt unten hinzu, wo Sie Ihre Sitzung gestartet haben:
<span>$pixel_color = imagecolorallocate($image, 0,0,255); </span><span>for($i=0;$i<1000;$i++) { </span> <span>imagesetpixel($image,rand()%200,rand()%50,$pixel_color); </span><span>} </span>
Ersetzen Sie das IMG SRC -Tag in der Funktion display () durch
<span>$letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; </span><span>$len = strlen($letters); </span><span>$letter = $letters[rand(0, $len-1)]; </span> <span>$text_color = imagecolorallocate($image, 0,0,0);</span>
und der Teil, in dem wir das PNG -Bild in create_image () erstellt haben, werden ebenfalls durch
ersetzt<span>for ($i = 0; $i< 6;$i++) { </span> <span>$letter = $letters[rand(0, $len-1)]; </span> <span>imagestring($image, 5, 5+($i*30), 20, $letter, $text_color); </span> <span>$word.=$letter; </span><span>} </span><span>$_SESSION['captcha_string'] = $word;</span>
Die Bilder werden nun so etwas wie Image39342015 genannt. In diesem Verfahren werden Bilder so oft erstellt, wie die Seite aktualisiert wird, wodurch große Mengen an Speicherplatz verschwenden können. Daher werden wir sicherstellen, dass alle anderen Bilder der PNG -Erweiterung vor dem Erstellen eines Bildes gelöscht werden. Fügen Sie Folgendes hinzu, kurz bevor die Funktion von ImagePng () aufgerufen wird.
<span>$word.=$letter; </span><span>$_SESSION['captcha_string'] = $word; </span>
In einer Produktions -App stellen Sie einfach sicher, dass Sie den Ordner isolieren, in dem CAPTCHA -Bilder gespeichert werden, andere nützliche Bilder werden möglicherweise ebenfalls gelöscht.
Laden Sie den vollständigen Code hier herunter.
Es ist sehr einfach, verschiedene Arten von Captchas in PHP zu erstellen. Dieser Artikel behandelte die drei grundlegenden Dinge, die zum Erstellen eines Standard -Captcha - Form, Verzerrung und Text - verwendet wurden. Dieser Artikel war ein Beweis für das Konzept, und der hier vorgestellte Code sollte nicht in der Produktion verwendet werden - zumal exzellente Alternativen wie Recaptcha existieren, was auch die Tonausgabe unterstützt, um Menschen mit Hörbehinderungen zu helfen. Wir hoffen, Sie haben diesen Artikel interessant gefunden. Hinterlassen Sie Ihre Kommentare und Feedback unten!
Wie kann ich meine Captcha sicherer machen? Eine Möglichkeit besteht darin, eine Mischung aus alphanumerischen Zeichen, sowohl den oberen als auch den unteren Gehäuse, zu verwenden. Dies erhöht die Anzahl der möglichen Kombinationen und macht es Bots schwieriger zu erraten. Sie können auch die Länge der Captcha erhöhen. Eine andere Methode besteht darin, dem Captcha -Bild Rauschen wie Linien oder Punkte hinzuzufügen. Dies kann mit den Funktionen imageline () und imageSellipse () in php. Mehrere Gründe. Ein häufiger Grund ist, dass die GD -Bibliothek in Ihrer PHP -Installation nicht installiert oder aktiviert ist. Sie können dies durch die Funktion der Funktion_Exists ("GD_Info") überprüfen. Wenn es false zurückgibt, ist GD nicht aktiviert. Ein weiterer Grund könnten Fehler in Ihrem PHP -Code sein. Überprüfen Sie Ihre Fehlerprotokolle auf Hinweise. Sie müssten eine JavaScript -Funktion erstellen, die eine Anforderung an den Server sendet, um eine neue Captcha zu generieren. Der Server antwortet dann mit dem neuen Captcha -Bild, das dann auf der Webseite ohne vollständige Seite neu geladen wird.
Warum funktioniert meine Captcha -Validierung nicht? zu mehreren Gründen. Ein häufiger Grund ist, dass die Sitzungsvariablen nicht korrekt festgelegt oder abgerufen werden. Stellen Sie sicher, dass Session_Start () aufgerufen wird, bevor eine Ausgabe an den Browser gesendet wird und die Sitzungsvariablen korrekt verwendet werden. Ein weiterer Grund könnte sein, dass die Eingabe des Benutzers nicht korrekt mit dem Captcha verglichen wird. Stellen Sie sicher Beeinträchtigte Benutzer können eine Herausforderung sein, aber es gibt verschiedene Methoden. Eine Methode besteht darin, eine Audio -Captcha -Option bereitzustellen. Dies beinhaltet die Generierung einer Audiodatei mit den laut gesprochenen Captcha -Zeichen. Eine andere Methode ist die Verwendung eines alternativen fragbasierten Captcha, bei dem dem Benutzer eine einfache Frage gestellt wird, dass ein Bot Schwierigkeiten haben würde, zu beantworten. Sie sind so konzipiert, dass sie Bots verhindern, und sind nicht narrensicher. Erweiterte Bots können OCR (optische Charaktererkennung) verwenden, um die Captcha -Zeichen zu lesen. Indem Sie Ihr Captcha komplexer machen, z. B. eine Mischung aus Zeichen, das Hinzufügen von Geräuschen und das regelmäßige Ändern der Captcha, können Sie es Bots schwerer machen. ? Andere Methoden sind die Verwendung eines Honeypots, bei dem es sich um ein verstecktes Formularfeld handelt, das Bots ausfüllen wird, der Menschen jedoch nicht das Verhalten des Benutzers überprüft, z. Spam basierend auf einer Datenbank mit bekannter Spam.
Das obige ist der detaillierte Inhalt vonEinfache Captchas mit PHP und GD. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!