Heim > Backend-Entwicklung > PHP-Tutorial > PHP implementiert einen dynamischen Zufallsverifizierungscode-Mechanismus (CAPTCHA)

PHP implementiert einen dynamischen Zufallsverifizierungscode-Mechanismus (CAPTCHA)

WBOY
Freigeben: 2016-08-08 09:30:01
Original
1093 Leute haben es durchsucht

PHP implementiert einen dynamischen Zufalls-Verifizierungscode-Mechanismus

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.

1.Einführung in die PHP-Bildverarbeitung

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.

Der erste Schritt besteht darin, den Datei-MIME-Typ und den Ausgabetyp festzulegen. Ändern Sie den Ausgabetyp in Bildstream

header('Content-Type: image/png;');

Im Allgemeinen können generierte Bilder PNG, JPEG, GIF, WBMP sein

Der zweite Schritt besteht darin, einen Grafikbereich und einen Bildhintergrund zu erstellen

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

imagefill($im,0,0,$blue);

Der vierte Schritt besteht darin, einige Zeilen, Text usw. auf dem blauen Hintergrund einzugeben
Farbfüller

$white = imagecolorallocate($im,255,255,255);

Zeichnen Sie zwei Liniensegmente: Bildlinie

imageline() zeichnet ein Liniensegment im Bild

von den Koordinaten , color bis image, x1 (obere linke Ecke des Bildes ist 0, 0) mit y1 Farbe. x2Syntax: bool imageline ( resources y2 , int , int $image , int $x1 , int $y1 , int $x2 )$y2$color

imageline($im,0,0,200,200,$white);

imageline($im,200,0,0,200,$white);

Zeichnen Sie eine horizontale Zeichenfolge: imagestring

imagestring() verwendet die Farbe

, 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. ySyntax: bool imagestring ( resources font , int , int $image , int $font , string $x , int $y )$s$col

imagestring($im,5,66,20,'jingwhale',$white);
Schritt 5, Ausgabe der endgültigen Grafik

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);

Der sechste Schritt besteht darin, alle Ressourcen zu löschen

imagedestroy() gibt den mit image verknüpften Speicher frei. Syntax: bool imagedestroy ( Ressource $image )

imagedestroy($im);

Grafiken, die durch Aufruf anderer Seiten (HTML) erstellt wurden

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>?>
Nach dem Login kopieren

Anzeigeeffekt:

2. Erstellen Sie einen dynamischen Bestätigungscode

Anhängen: Code-Quelladressehttps://github.com/cnblogs-/php-captcha

1. Erstellen Sie ein Bild mit Bestätigungscode und verwischen Sie den Hintergrund

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>);
Nach dem Login kopieren

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>
Nach dem Login kopieren
<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>?>
Nach dem Login kopieren
2. Erstellen Sie einen Verifizierungsmechanismus

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>
Nach dem Login kopieren

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>?>
Nach dem Login kopieren

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>
Nach dem Login kopieren

3. Klicken Sie auf das Bild des Bestätigungscodes, um den Bestätigungscode zu aktualisieren

Wenn Sie den Bestätigungscode oben aktualisieren möchten, müssen Sie die Seite aktualisieren; wir schreiben eine codeimg.js-Funktion, um den Bestätigungscode zu aktualisieren, indem Sie auf das Bild des Bestätigungscodes klicken

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>
Nach dem Login kopieren
Dann

Ende

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.

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage