gd 拡張を有効にする必要があります。次のコードを使用して、gd 拡張が有効かどうかを確認できます。
<?phpecho "Hello World!!!!";echo phpinfo();?>
次に、ブラウザで gd オプションを検索Ctrl+F
して、この拡張機能がインストールされているかどうかを確認します。インストールされていない場合は、自分で拡張機能をインストールする必要があります。
はデフォルトで黒の背景を生成します
<?php // 使用gd的 imagecreatetruecolor();创建一张背景图 $image = imagecreatetruecolor(100,30);// 在显示这张图片的时候一定要先声明头信息 header('content-type:image/png'); imagepng($image);// 释放资源,销毁执行对象imagedestroy($image);
塗りつぶしの色を作成し、imagefill(image, x, y, color) メソッドを使用してアタッチします。
<?php // 使用gd的 imagecreatetruecolor();创建一张背景图 $image = imagecreatetruecolor(100,30);// 生成填充色 $bgcolor = imagecolorallocate($image,255,255,255);// 将填充色填充到背景图上 imagefill($image,0,0,$bgcolor);// 在显示这张图片的时候一定要先声明头信息 header('content-type:image/png'); imagepng($image);// 释放资源,销毁执行对象imagedestroy($image);
このメソッドを使用する前に、必ず最初にヘッダー情報を設定してください。そうしないと、画像が正常に表示されません
リソースをタイムリーに解放すると、サーバーリクエストの負荷が軽減されます。
後の処理を容易にするために色情報を生成します。
$fontcolor=imagecolorallocate($image,rand(0,255),rand(0,255),rand(0,255));
画像の対応する位置にコンテンツ情報を書き込みます。
imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);
// 生成一些干扰的点,这里是200个 for($i=0;$i<200;$i++){ $pointcolor = imagecolorallocate($image,rand(50,255),rand(50,255),rand(50,255)); imagesetpixel($image,rand(0,100),rand(0,30),$pointcolor); }
// 生成一些干扰线 这里是5个 for($i=0;$i<5;$i++){ // 设置为浅色的线,防止喧宾夺主 $linecolor = imagecolorallocate($image,rand(50,255),rand(50,255),rand(50,255)); imageline($image,rand(0,99),rand(0,29),rand(0,99),rand(0,29),$linecolor); }
<?php // 使用gd的imagecreatetruecolor();创建一张背景图 $image = imagecreatetruecolor(100,40);// 生成填充色 $bgcolor = imagecolorallocate($image,255,255,255);// 将填充色填充到背景图上 imagefill($image,0,0,$bgcolor);//////// 生成随机4位字母以及数字混合的验证码 for($i=0;$i<4;$i++){ $fontsize = rand(6,8); $fontcolor = imagecolorallocate($image,rand(0,255),rand(0,255),rand(0,255)); // 为了避免用户难于辨认,去掉了某些有歧义的字母和数字 $rawstr = 'abcdefghjkmnopqrstuvwxyz23456789ABCDEFGHJKLMNOPQRSTUVWXYZ'; $fontcontent = substr($rawstr,rand(0,strlen($rawstr)),1); // 避免生成的图片重叠 $x += 20; $y = rand(10,20); imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor); }// 生成一些干扰的点,这里是200个for($i=0;$i<200;$i++){ $pointcolor = imagecolorallocate($image,rand(50,255),rand(50,255),rand(50,255)); imagesetpixel($image,rand(0,100),rand(0,30),$pointcolor); } // 生成一些干扰线 这里是4个for($i=0;$i<4;$i++){ // 设置为浅色的线,防止喧宾夺主 $linecolor = imagecolorallocate($image,rand(50,255),rand(50,255),rand(50,255)); imageline($image,rand(0,99),rand(0,29),rand(0,99),rand(0,29),$linecolor); } header('content-type:image/png'); imagepng($image);// 释放资源,销毁执行对象imagedestroy($image);
注: セッションは最初に開く必要があります
検証プロセスは、クライアントが入力した検証コードとセッションドメインに存在する検証コードを比較することです。つまり:
if(isset($_REQUEST['checkcode'])){ session_start(); if($_REQUEST['checkcode']==$_SESSION['checkcode']){ echo "<font color='green'>Success!</font>"; }else{ echo "<font color='red'>Failed!</font>"; } exit(); }
しかし、このように単に検証することには欠点があります。それは、文字の大文字化がエラーになりやすいということです。したがって、ユーザーが入力したすべての値を小文字に変更する変換を行う必要があります。
if(strtolower($_REQUEST['checkcode'])==$_SESSION['checkcode']){···}
フォーム認証
<?php header("Content-Type:text/html;charset=utf8"); if(isset($_REQUEST['checkcode'])){ session_start(); if(strtolower($_REQUEST['checkcode'])==$_SESSION['checkcode']){ echo "<font color='green'>Success!</font>"; }else{ echo "<font color='red'>Failed!</font>"; } exit(); }?> <!DOCTYPE html><html><head> <meta charset="utf-8" /> <title>验证验证码信息</title> <script> function change(){ document.getElementById("image_checkcode").src='./store.php?r='+Math.random(); } </script></head><body><form action="./form.php" method="post"><p>验证码图片:</p> <img id="image_checkcode" src="./store.php?r=<?php echo rand();?>" /> <a href="javascript:void(0)" onclick="change()">看不清楚</a> <br/>请输入验证码<input type="text" name="checkcode" /><br /><p> <input type="submit" value="提交" /></p></form> </body></html>まとめ
最後にまとめをしておきます。
PHP を使用して検証コードを作成するには、gd 拡張機能のサポートが必要です。
imagecreatetruecolor メソッドを使用して背景色を生成し、imagefill を使用して imagecolorallocate によって生成された色で背景を塗りつぶします。
imagestringを使用して検証コードと背景画像を結合します
imagesetpixelを使用して干渉点を追加します
imagelineを使用して干渉線を追加します
セッションを使用する前に、session_start()メソッドを有効にする必要があります最初に
JavaScript を使用して検証コードの src を動的に変更し、ユーザーの「変更」のニーズに応えます。
以上がPHP 検証コードの実装原理の詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。