CAPTCHA ist die Abkürzung für „Completely Automated Public Turing test to tell Computers and Humans Apart“. Es handelt sich um einen öffentlichen, vollautomatischen Test, um zu unterscheiden, ob ein Benutzer ein Computer oder ein Mensch ist. Es kann Folgendes verhindern: böswilliges Knacken von Passwörtern, Ticketbetrug, Forenflutung und verhindert effektiv, dass ein Hacker ein bestimmtes Programm nutzt, um einen bestimmten registrierten Benutzer brutal zu zwingen, sich kontinuierlich anzumelden. Tatsächlich ist die Verwendung von Bestätigungscodes eine gängige Methode für viele Websites Jetzt verwenden wir diese Funktion auf relativ einfache Weise.
Diese Frage kann von einem Computer generiert und beurteilt werden, aber nur Menschen können sie beantworten. Da Computer keine CAPTCHA-Fragen beantworten können, kann der Benutzer, der die Fragen beantwortet, als Mensch betrachtet werden.
Die dynamische Verifizierungscodeproduktion von PHP basiert auf der Bildverarbeitung von PHP. Lassen Sie uns zunächst die Bildverarbeitung von PHP vorstellen.
In PHP5 ist die Verarbeitung dynamischer Bilder viel einfacher als zuvor. PHP5 enthält das GD-Erweiterungspaket in der Datei php.ini. Sie müssen nur die entsprechenden Kommentare des GD-Erweiterungspakets entfernen, um es normal zu verwenden. Die in PHP5 enthaltene GD-Bibliothek ist die aktualisierte GD2-Bibliothek, die einige nützliche JPG-Funktionen enthält, die die Verarbeitung von Echtfarbenbildern unterstützen.
Im Allgemeinen werden generierte Grafiken im Dokumentformat von PHP gespeichert, dynamische Grafiken können jedoch direkt über die Bildeinfügungsmethode SRC von HTML abgerufen werden. Zum Beispiel Bestätigungscode, Wasserzeichen, Miniaturansicht usw.
Allgemeiner Prozess zum Erstellen von Bildern:
1). Legen Sie den Header fest, um dem Browser den MIME-Typ mitzuteilen, den Sie generieren möchten.
2) Erstellen Sie einen Bildbereich und alle nachfolgenden Vorgänge basieren auf diesem Bildbereich.
3) Zeichnen Sie einen gefüllten Hintergrund in den leeren Bildbereich.
4) Zeichnen Sie grafische Umrisse auf den Hintergrund, um Text einzugeben.
5). Geben Sie die endgültigen Grafiken aus.
6). Löschen Sie alle Ressourcen.
7). Rufen Sie Bilder von anderen Seiten auf.
header('Content-Type: image/png;');
Im Allgemeinen können generierte Bilder PNG, JPEG, GIF, WBMP sein
imagecreatetruecolor() gibt eine Bildkennung zurück, die ein schwarzes Bild der Größen x_size
und y_size
darstellt. Syntax: resources imagecreatetruecolor ( int $width
, int $height
)
$im = imagecreatetruecolor(200,200);
Der dritte Schritt besteht darin, einen gefüllten Hintergrund in den leeren Bildbereich zu zeichnen
erfordert einen Farbfüller; imagecolorallocate – weist einem Bild eine Farbe zu; Syntax: int imagecolorallocate ( resources $image
, int $red
, int $green
) $blue
$blue = imagecolorallocate($im,0,102,255);
Füllen Sie diese blaue Farbe in den Hintergrund; Syntax: bool imagefill ( resources , int $image
, int $x
)$y
$color
FarbfüllerDer vierte Schritt besteht darin, einige Zeilen, Text usw. auf dem blauen Hintergrund einzugeben
$white = imagecolorallocate($im,255,255,255);
imageline() zeichnet ein Liniensegment im BildZeichnen Sie zwei Liniensegmente: Bildlinie
von den Koordinaten , color
bis image
, x1
(obere linke Ecke des Bildes ist 0, 0) mit y1
Farbe. x2
Syntax: bool imageline ( resources y2
, int , int $image
, int $x1
, int $y1
, int $x2
)$y2
$color
imagestring() verwendet die Farbeimageline($im,200,0,0,200,$white);
Zeichnen Sie eine horizontale Zeichenfolge: imagestring
, um die Zeichenfolge zu den Koordinaten col
, s
des durch image
dargestellten Bildes zu zeichnen (dies ist die Koordinate der oberen linken Ecke). der Zeichenfolge, das gesamte Bild Die obere linke Ecke des Bildes ist 0,0). Wenn x
1, 2, 3, 4 oder 5 ist, wird die integrierte Schriftart verwendet. y
Syntax: bool imagestring ( resources font
, int , int $image
, int $font
, string $x
, int $y
)$s
$col
imagepng() Gibt einen GD-Bildstream (image
) im PNG-Format an die Standardausgabe (normalerweise einen Browser) oder in eine Datei aus, wenn ein Dateiname mit filename
angegeben wird. Syntax: bool imagepng ( Ressource $image
[, Zeichenfolge $filename
] )
imagepng($im);
imagedestroy() gibt den mit image
verknüpften Speicher frei. Syntax: bool imagedestroy ( Ressource $image
)
imagedestroy($im);
Der Beispielcode lautet wie folgt:
<?<span>php </span><span>//</span><span>第一步,设置文件MIME类型</span> <span>header</span>('Content-Type: image/png;'<span>); </span><span>//</span><span>第二步,创建一个图形区域,图像背景</span> <span>$im</span> = imagecreatetruecolor(200,200<span>); </span><span>//</span><span>第三步,在空白图像区域绘制填充背景</span> <span>$blue</span> = imagecolorallocate(<span>$im</span>,0,102,255<span>); imagefill(</span><span>$im</span>,0,0,<span>$blue</span><span>); </span><span>//</span><span>第四步,在蓝色的背景上输入一些线条,文字等</span> <span>$white</span> = imagecolorallocate(<span>$im</span>,255,255,255<span>); imageline(</span><span>$im</span>,0,0,200,200,<span>$white</span><span>); imageline(</span><span>$im</span>,200,0,0,200,<span>$white</span><span>); imagestring(</span><span>$im</span>,5,66,20,'Jing.Whale',<span>$white</span><span>); </span><span>//</span><span>第五步,输出最终图形</span> imagepng(<span>$im</span><span>); </span><span>//</span><span>第六步,我要将所有的资源全部清空</span> imagedestroy(<span>$im</span><span>); </span>?>
Anzeigeeffekt:
Anhängen: Code-Quelladressehttps://github.com/cnblogs-/php-captcha
Der Zufallscode verwendet Hexadezimalzahlen; der unscharfe Hintergrund bedeutet, dass dem Hintergrund des Bildes Linien, Schneeflocken usw. hinzugefügt werden.
1) Zufallscode erstellen
<span>for</span> (<span>$i</span>=0;<span>$i</span><<span>$_rnd_code</span>;<span>$i</span>++<span>) { </span><span>$_nmsg</span> .= <span>dechex</span>(<span>mt_rand</span>(0,15<span>)); }</span>
string dechex (int $number
), gibt einen String zurück, der die hexadezimale Darstellung des angegebenen number
-Parameters enthält.
2) In Sitzung speichern
<span>$_SESSION</span>['code'] = <span>$_nms</span>
3) Bilder erstellen
<span>//</span><span>创建一张图像</span> <span>$_img</span> = imagecreatetruecolor(<span>$_width</span>,<span>$_height</span><span>); </span><span>//</span><span>白色</span> <span>$_white</span> = imagecolorallocate(<span>$_img</span>,255,255,255<span>); </span><span>//</span><span>填充</span> imagefill(<span>$_img</span>,0,0,<span>$_white</span><span>); </span><span>if</span> (<span>$_flag</span><span>) { </span><span>//</span><span>黑色,边框</span> <span>$_black</span> = imagecolorallocate(<span>$_img</span>,0,0,0<span>); imagerectangle(</span><span>$_img</span>,0,0,<span>$_width</span>-1,<span>$_height</span>-1,<span>$_black</span><span>); }</span>
4) Unscharfer Hintergrund
<span>//</span><span>随即画出6个线条</span> <span>for</span> (<span>$i</span>=0;<span>$i</span><6;<span>$i</span>++<span>) { </span><span> $_rnd_color</span> = imagecolorallocate(<span>$_img</span>,<span>mt_rand</span>(0,255),<span>mt_rand</span>(0,255),<span>mt_rand</span>(0,255<span>)); imageline(</span><span>$_img</span>,<span>mt_rand</span>(0,<span>$_width</span>),<span>mt_rand</span>(0,<span>$_height</span>),<span>mt_rand</span>(0,<span>$_width</span>),<span>mt_rand</span>(0,<span>$_height</span>),<span>$_rnd_color</span><span>); } </span><span>//随机</span><span>雪花</span> <span>for</span> (<span>$i</span>=0;<span>$i</span><100;<span>$i</span>++<span>) { </span><span>$_rnd_color</span> = imagecolorallocate(<span>$_img</span>,<span>mt_rand</span>(200,255),<span>mt_rand</span>(200,255),<span>mt_rand</span>(200,255<span>)); imagestring(</span><span>$_img</span>,1,<span>mt_rand</span>(1,<span>$_width</span>),<span>mt_rand</span>(1,<span>$_height</span>),'*',<span>$_rnd_color</span><span>); }</span>
5) Ausgabe und Zerstörung
<span>//</span><span>输出验证码</span> <span>for</span> (<span>$i</span>=0;<span>$i</span><<span>strlen</span>(<span>$_SESSION</span>['code']);<span>$i</span>++<span>) { </span><span>$_rnd_color</span> = imagecolorallocate(<span>$_img</span>,<span>mt_rand</span>(0,100),<span>mt_rand</span>(0,150),<span>mt_rand</span>(0,200<span>)); imagestring(</span><span>$_img</span>,5,<span>$i</span>*<span>$_width</span>/<span>$_rnd_code</span>+<span>mt_rand</span>(1,10),<span>mt_rand</span>(1,<span>$_height</span>/2),<span>$_SESSION</span>['code'][<span>$i</span>],<span>$_rnd_color</span><span>); } </span><span>//</span><span>输出图像</span> <span>header</span>('Content-Type: image/png'<span>); imagepng(</span><span>$_img</span><span>); </span><span>//</span><span>销毁</span> imagedestroy(<span>$_img</span>);
Kapseln Sie es in der globalen Funktionsbibliothek global.func.php, und der Funktionsname lautet _code(), um den Aufruf zu erleichtern. Wir werden die vier Parameter $_width, $_height, $_rnd_code, $_flag festlegen, um die Flexibilität der Funktion zu erhöhen.
* @param int $_width Die Länge des Bestätigungscodes: Wenn Sie 6 Ziffern wünschen, wird 75 50 empfohlen; wenn Sie 8 Ziffern wünschen, wird 75 50 50 empfohlen, und so weiter
* @param int $ _height Die Höhe des Bestätigungscodes
* @param int $_rnd_code Die Anzahl der Ziffern im Bestätigungscode
* @param bool $_flag Ob der Bestätigungscode einen Rand erfordert: true mit Rand, false ohne Rand (Standard). )
Der gekapselte Code lautet wie folgt:
<?<span>php </span><span>/*</span><span>* * [verification-code] (C)2015-2100 jingwhale. * * This is a freeware * $Id: global.func.php 2015-02-05 20:53:56 jingwhale$ </span><span>*/</span>
<span>/*</span><span>* * _code()是验证码函数 * @access public * @param int $_width 验证码的长度:如果要6位长度推荐75+50;如果要8位,推荐75+50+50,依次类推 * @param int $_height 验证码的高度 * @param int $_rnd_code 验证码的位数 * @param bool $_flag 验证码是否需要边框:true有边框, false无边框(默认) * @return void 这个函数执行后产生一个验证码 </span><span>*/</span> <span>function</span> _code(<span>$_width</span> = 75,<span>$_height</span> = 25,<span>$_rnd_code</span> = 4,<span>$_flag</span> = <span>false</span><span>) { </span><span>//</span><span>创建随机码</span> <span>for</span> (<span>$i</span>=0;<span>$i</span><<span>$_rnd_code</span>;<span>$i</span>++<span>) { </span><span>$_nmsg</span> .= <span>dechex</span>(<span>mt_rand</span>(0,15<span>)); } </span><span>//</span><span>保存在session</span> <span>$_SESSION</span>['code'] = <span>$_nmsg</span><span>; </span><span>//</span><span>创建一张图像</span> <span>$_img</span> = imagecreatetruecolor(<span>$_width</span>,<span>$_height</span><span>); </span><span>//</span><span>白色</span> <span>$_white</span> = imagecolorallocate(<span>$_img</span>,255,255,255<span>); </span><span>//</span><span>填充</span> imagefill(<span>$_img</span>,0,0,<span>$_white</span><span>); </span><span>if</span> (<span>$_flag</span><span>) { </span><span>//</span><span>黑色,边框</span> <span>$_black</span> = imagecolorallocate(<span>$_img</span>,0,0,0<span>); imagerectangle(</span><span>$_img</span>,0,0,<span>$_width</span>-1,<span>$_height</span>-1,<span>$_black</span><span>); } </span><span>//</span><span>随即画出6个线条</span> <span>for</span> (<span>$i</span>=0;<span>$i</span><6;<span>$i</span>++<span>) { </span><span>$_rnd_color</span> = imagecolorallocate(<span>$_img</span>,<span>mt_rand</span>(0,255),<span>mt_rand</span>(0,255),<span>mt_rand</span>(0,255<span>)); imageline(</span><span>$_img</span>,<span>mt_rand</span>(0,<span>$_width</span>),<span>mt_rand</span>(0,<span>$_height</span>),<span>mt_rand</span>(0,<span>$_width</span>),<span>mt_rand</span>(0,<span>$_height</span>),<span>$_rnd_color</span><span>); } </span><span>//</span><span>随即雪花</span> <span>for</span> (<span>$i</span>=0;<span>$i</span><100;<span>$i</span>++<span>) { </span><span>$_rnd_color</span> = imagecolorallocate(<span>$_img</span>,<span>mt_rand</span>(200,255),<span>mt_rand</span>(200,255),<span>mt_rand</span>(200,255<span>)); imagestring(</span><span>$_img</span>,1,<span>mt_rand</span>(1,<span>$_width</span>),<span>mt_rand</span>(1,<span>$_height</span>),'*',<span>$_rnd_color</span><span>); } </span><span>//</span><span>输出验证码</span> <span>for</span> (<span>$i</span>=0;<span>$i</span><<span>strlen</span>(<span>$_SESSION</span>['code']);<span>$i</span>++<span>) { </span><span>$_rnd_color</span> = imagecolorallocate(<span>$_img</span>,<span>mt_rand</span>(0,100),<span>mt_rand</span>(0,150),<span>mt_rand</span>(0,200<span>)); imagestring(</span><span>$_img</span>,5,<span>$i</span>*<span>$_width</span>/<span>$_rnd_code</span>+<span>mt_rand</span>(1,10),<span>mt_rand</span>(1,<span>$_height</span>/2),<span>$_SESSION</span>['code'][<span>$i</span>],<span>$_rnd_color</span><span>); } </span><span>//</span><span>输出图像</span> <span>header</span>('Content-Type: image/png'<span>); imagepng(</span><span>$_img</span><span>); </span><span>//</span><span>销毁</span> imagedestroy(<span>$_img</span><span>); } </span>?>
Erstellen Sie eine PHP-Bestätigungsseite und prüfen Sie, ob der Bestätigungscode während der gesamten Sitzung konsistent ist.
1) Erstellen Sie die Verifizierungsseite „ification-code.php“
<?<span>php </span><span>/*</span><span>* * [verification-code] (C)2015-2100 jingwhale. * * This is a freeware * $Id: verification-code.php 2015-02-05 20:53:56 jingwhale$ </span><span>*/</span> <span>//</span><span>设置字符集编码</span> <span>header</span>('Content-Type: text/html; charset=utf-8'<span>); </span>?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>verification code</title> <link rel="stylesheet" type="text/css" href="style/basic.css" /> </head> <body> <div> <form method="post" name="verification" action="verification-code.php?action=verification"> <<span>dl</span>> <dd>验证码:<input type="text" name="code" <span>class</span>="code" /><img src="codeimg.php" /></dd> <dd><input type="submit" <span>class</span>="submit" value="验证" /></dd> </<span>dl</span>> </form> </div> </body> </html>
wird wie folgt angezeigt:
2) Erstellen Sie eine Seite zur Generierung eines Bestätigungscodes
Erstellen Sie codeimg.php, um Verifizierungscodebilder für img im HTML-Code Verification-code.php bereitzustellen
Zuerst müssen Sie die Sitzung auf der Seite codeimg.php öffnen
Zweitens stellen wir unsere gekapselte globale Funktionsbibliothek global.func.php vor;
Schließlich run_code();
<?<span>php </span><span>/*</span><span>* * [verification-code] (C)2015-2100 jingwhale. * * This is a freeware * $Id: codeimg.php 2015-02-05 20:53:56 jingwhale$ </span><span>*/</span> <span>//</span><span>开启session</span> <span>session_start</span><span>(); </span><span>//</span><span>引入全局函数库(自定义)</span> <span>require</span> <span>dirname</span>(<span>__FILE__</span>).'/includes/global.func.php'<span>; </span><span>//</span><span>运行验证码函数。通过数据库的_code方法,设置验证码的各种属性,生成图片</span> _code(125,25,6,<span>false</span><span>); </span>?>
3) Sitzungsüberprüfungsmechanismus erstellen
Zuerst müssen Sie die Sitzung auf der Seite „Verifizierungscode.php“ öffnen
Entwerfen Sie zweitens eine Möglichkeit zum Senden des Bestätigungscodes. Wenn Aktion = Überprüfung ist, ist die Übermittlung erfolgreich
Schließlich erstellen Sie eine Überprüfungsfunktion. Das Prinzip besteht darin, zu überprüfen, ob der vom Client-Benutzer übermittelte Überprüfungscode mit dem Überprüfungscode der Sitzung im Server codeimg.php übereinstimmt. Es gibt eine js-Popup-Funktion _alert_back( ), die wir auch in global.func.php;
einkapselnÄndern Sie den PHP-Code in „ification-code.php“ wie folgt:
<?<span>php </span><span>/*</span><span>* * [verification-code] (C)2015-2100 jingwhale. * * This is a freeware * $Id: verification-code.php 2015-02-05 20:53:56 jingwhale$ </span><span>*/</span> <span>//</span><span>设置字符集编码</span> <span>header</span>('Content-Type: text/html; charset=utf-8'<span>); </span><span>//</span><span>开启session</span> <span>session_start</span><span>(); </span><span>//</span><span>引入全局函数库(自定义)</span> <span>require</span> <span>dirname</span>(<span>__FILE__</span>).'/includes/global.func.php'<span>; </span><span>//</span><span>检验验证码</span> <span>if</span> (<span>$_GET</span>['action'] == 'verification'<span>) { </span><span>if</span> (!(<span>$_POST</span>['code'] == <span>$_SESSION</span>['code'<span>])) { _alert_back(</span>'验证码不正确!'<span>); }</span><span>else</span><span>{ _alert_back(</span>'验证码通过!'<span>); } } </span>?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>verification code</title> <link rel="stylesheet" type="text/css" href="style/basic.css" /> <script type="text/javascript" src="js/codeimg.js"></script> </head> <body> <div> <form method="post" name="verification" action="verification-code.php?action=verification"> <<span>dl</span>> <dd>验证码:<input type="text" name="code" <span>class</span>="code" /><img src="codeimg.php" /></dd> <dd><input type="submit" <span>class</span>="submit" value="验证" /></dd> </<span>dl</span>> </form> </div> </body> </html>
3. Klicken Sie auf das Bild des Bestätigungscodes, um den Bestätigungscode zu aktualisieren
window.onload = <span>function</span><span> () { </span><span>var</span> code = document.getElementById('codeimg');<span>//</span><span>通过id找到html中img标签</span> code.onclick = <span>function</span> () {<span>//</span><span>为标签添加点击事件</span> <span>this</span>.src='codeimg.php?tm='+Math.random();<span>//</span><span>修改时间,重新指向codeimg.php</span> <span> }; }</span>
Nachdruck ist willkommen. Geben Sie beim Nachdruck bitte das Wort „Nachdruck“, den ursprünglichen Autor und die ursprüngliche Blog-Post-Adresse an.
Das Obige stellt die Implementierung des dynamischen Zufallsverifizierungscodemechanismus (CAPTCHA) in PHP vor, einschließlich verschiedener Aspekte. Ich hoffe, dass es für Freunde hilfreich sein wird, die sich für PHP-Tutorials interessieren.