国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

全面解析PHP驗證碼的實現原理 附php驗證碼小案例

2024-05-04 23:49:14
字體:
來源:轉載
供稿:網友

拓展

我們需要開啟gd拓展,可以使用下面的代碼來查看是否開啟gd拓展。

<?phpecho "Hello World!!!!";echo phpinfo();?>

然后在瀏覽器上Ctrl+F查找gd選項即可驗證自己有沒有裝這個拓展,如果沒有的話,還需要自己全裝一下這個拓展。

背景圖

imagecreatetruecolor

默認生成黑色背景

<?php// 使用gd的imagecreatetruecolor();創建一張背景圖$image = imagecreatetruecolor(100,30);// 在顯示這張圖片的時候一定要先聲明頭信息header('content-type:image/png');imagepng($image);// 釋放資源,銷毀執行對象imagedestroy($image);

imagecolorallocate

創建一個填充色,并用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);

imagepng

在使用這個方法之前,一定要先設置頭信息,否則不會正常的顯示圖片 

imagedestory(image)

適時的釋放資源會減輕對服務器請求的壓力。 

簡易數字驗證碼

imagecolorallocate

生成顏色信息,方便待會的賦予處理。

$fontcolor=imagecolorallocate($image,rand(0,255),rand(0,255),rand(0,255));

imagestring

把內容信息寫到圖片的相應位置上。

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

使用驗證碼

開啟session的時機

注意: 開啟session一定要在開始的地方 

驗證的原理

驗證的過程就是客戶端輸入的驗證碼和存在于session域中的驗證碼進行對比。即:

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']){···}

小案例

生成驗證碼

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

表單驗證

<?phpheader("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之前要在開頭開啟session_start()方法
 •使用JavaScript來動態的修改驗證碼的src,來滿足用戶“換一張”的需求。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 封丘县| 英超| 交口县| 平乡县| 台北县| 瑞丽市| 石阡县| 甘孜| 高雄市| 毕节市| 遵义市| 宿松县| 湄潭县| 柳州市| 徐水县| 关岭| 鹤山市| 黑龙江省| 南平市| 山西省| 白银市| 广东省| 尚义县| 高青县| 册亨县| 全州县| 安阳县| 剑河县| 富宁县| 开化县| 长乐市| 芜湖市| 栖霞市| 普兰县| 澄江县| 德安县| 凌源市| 延安市| 兴业县| 临夏市| 高邑县|