《PHP教程:全面解析PHP驗證碼的實現原理 附php驗證碼小案例》要點:
本文介紹了PHP教程:全面解析PHP驗證碼的實現原理 附php驗證碼小案例,希望對您有用。如果有疑問,可以聯系我們。
拓展PHP實戰
我們需要開啟gd拓展,可以使用下面的代碼來查看是否開啟gd拓展.PHP實戰
<?php echo "Hello World!!!!"; echo phpinfo(); ?>
然后在瀏覽器上Ctrl+F查找gd選項即可驗證自己有沒有裝這個拓展,如果沒有的話,還需要自己全裝一下這個拓展.PHP實戰
背景圖PHP實戰
imagecreatetruecolorPHP實戰
默認生成黑色背景PHP實戰
<?php // 使用gd的imagecreatetruecolor();創建一張背景圖 $image = imagecreatetruecolor(100,30); // 在顯示這張圖片的時候一定要先聲明頭信息 header('content-type:image/png'); imagepng($image); // 釋放資源,銷毀執行對象 imagedestroy($image);
imagecolorallocatePHP實戰
創建一個填充色,并用imagefill(image,x,y,color)方法來附著.PHP實戰
<?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);
imagepngPHP實戰
在使用這個方法之前,一定要先設置頭信息,否則不會正常的顯示圖片?
PHP實戰
imagedestory(image)PHP實戰
適時的釋放資源會減輕對服務器請求的壓力.?
PHP實戰
簡易數字驗證碼PHP實戰
imagecolorallocatePHP實戰
生成顏色信息,方便待會的賦予處理.PHP實戰
$fontcolor=imagecolorallocate($image,rand(0,255),rand(0,255),rand(0,255));PHP實戰
imagestringPHP實戰
把內容信息寫到圖片的相應位置上.PHP實戰
imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);PHP實戰
增加識別干擾PHP實戰
//增加點 // 生成一些干擾的點,這里是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實戰
<?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);
使用驗證碼PHP實戰
開啟session的時機PHP實戰
注意: 開啟session一定要在開始的地方?
PHP實戰
驗證的原理PHP實戰
驗證的過程就是客戶端輸入的驗證碼和存在于session域中的驗證碼進行對比.即:PHP實戰
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(); }
優化驗證PHP實戰
但是簡單的這樣驗證有一點不好的地方,那就是字母的大小寫容易出錯.所以我們要做一下轉換,將用戶輸入的數值全部變成小寫的.PHP實戰
if(strtolower($_REQUEST['checkcode'])==$_SESSION['checkcode']){???}
PHP實戰
小案例PHP實戰
生成驗證碼PHP實戰
<?php session_start();// 必須在php的最開始部分聲明,來開啟session // 使用gd的imagecreatetruecolor();創建一張背景圖 $image = imagecreatetruecolor(100,40); // 生成填充色 $bgcolor = imagecolorallocate($image,255,255,255); // 將填充色填充到背景圖上 imagefill($image,0,0,$bgcolor); //////// 生成隨機4位字母以及數字混合的驗證碼 $checkcode=''; for($i=0;$i<4;$i++){ $fontsize = rand(6,8); $fontcolor = imagecolorallocate($image,rand(0,255),rand(0,255),rand(0,255)); // 為了避免用戶難于辨認,去掉了某些有歧義的字母和數字 $rawstr = 'abcdefghjkmnopqrstuvwxyz23456789'; $fontcontent = substr($rawstr,rand(0,strlen($rawstr)),1); // 拼接即將誕生的驗證碼 $checkcode.=$fontcontent; // 避免生成的圖片重疊 $x += 20; $y = rand(10,20); imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor); } // 保存到session變量中 $_SESSION['checkcode']=$checkcode; // 生成一些干擾的點,這里是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);
表單驗證PHP實戰
<?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="void(0)" onclick="change()">看不清楚</a><br/> 請輸入驗證碼<input type="text" name="checkcode" /><br /> <p><input type="submit" value="提交" /></p> </form> </body> </html>
總結PHP實戰
最后,來個總結吧.
??使用php制作驗證碼需要gd拓展的支持.
??使用imagecreatetruecolor方法生成背景色,并用imagefill填充一個由imagecolorallocate產生的顏色.
??使用imagestring來實現驗證碼和背景圖的結合
??使用imagesetpixel來添加干擾點
??使用imageline來添加干擾線
??使用session之前要在開頭開啟session_start()方法
??使用JavaScript來動態的修改驗證碼的src,來滿足用戶“換一張”的需求.
PHP實戰
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持維易PHP.
PHP實戰
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/4772.html