項目中經常會遇到一些登陸驗證,支付驗證等等一系列安全驗證的策略。實現方法多種多樣,下面就來講解下如何用php生成簡單的文字+數字組合的驗證碼:
所用語言php,gd庫
原理解釋:
a>實質上是在服務器端隨機生成驗證碼,將其存儲在$_SESSION中。
b>然后將驗證碼寫在圖片上,將圖片發送至客戶端,用戶輸入圖片的上的驗證碼,遞交給服務器。
c>服務端再與$_SESSION中存儲的信息比對,一致則通過,否則不通過。

分為兩步:
1)第一步服務器端生成驗證碼
2)客戶端使用驗證碼
第一步:在服務器端如何生成驗證碼:<code.php>
<?php session_start();
//1>session_start()必須置於最頂部,2>多服務器,要考慮集中管理session信息 //phpinfo();//打印出php的信息
//1.生成一張底圖(width:100;height:30) $image=imagecreatetruecolor(100,30); $bgcolor=imagecolorallocate($image,255,255,255);//畫筆着色 imagefill($image,0,0,$bgcolor);//將底圖的着色 //隨機生成四個數字 /* for($i=0;$i<4;$i++){ $fontcolor=imagecolorallocate($image,rand(0,120),rand(0,120),rand(0,120)); $fontcontent=rand(0,9);//驗證碼的內容 $fontsize=6;//字體大小 $x=($i*100/4)+rand(5,10);//x軸 $y=rand(5,10);//Y軸 imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);//使用imagestring()將文字寫在畫布上 } */ $captch_code=""; for($i=0;$i<4;$i++){ $fontsize=6; $fontcolor=imagecolorallocate($image,rand(20,100),rand(30,100),rand(10,200)); $str="abcdefghkmnpwsert1234567890";//給出一個字符串,用於生成隨機驗證碼 $fontcontent=substr($str,rand(0,strlen($str)),1);//每次截取一個字符 $captch_code.=$fontcontent;//拼接 $x=($i*100/4)+rand(5,10); $y=rand(5,10); imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor); } $_SESSION['authcode']=$captch_code;//保存在session中 //添加干擾點 for($i=0;$i<100;$i++){ $pointcolor=imagecolorallocate($image,rand(50,200),rand(50,200),rand(50,200)); imagesetpixel($image,rand(0,100),rand(0,30),$pointcolor); } //添加干擾線 for($i=0;$i<3;$i++){ $linecolor=imagecolorallocate($image,rand(80,200),rand(80,200),rand(80,200)); imageline($image,rand(5,95),rand(5,25),rand(5,95),rand(5,25),$linecolor); }
ob_clean();//清空緩存 header("content-type:".'image/png');//輸出圖片的頭文件固定格式(可以是image/jpg、image/png、) imagepng($image);//向瀏覽器輸出一張圖片 imagedestroy($image);//銷毀內存中的底圖 //session_start
第二步:將生成的驗證碼圖片返回給客戶端<form.php>
<?php
header("Content-type:text/html;charset=utf-8");//避免出現亂碼的情況
if(isset($_REQUEST['authcode'])){
session_start();//使用$_SESSION之前必須使用session_start()
if(strtolower($_REQUEST['authcode'])==$_SESSION["authcode"]){//$_SESSION['authcode']是服務器端存儲的驗證碼,$_REQUEST['authcode']獲取客戶端輸入的信息
echo "<font color='#000cc'>輸入正確</font>";
}
else{
echo "<font color='#0000cc'>輸入錯誤</font>";
}
exit();
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>驗證碼正確</title>
</head>
</html>
<body>
<form action="./form.php">
<p>驗證碼圖片:
//點擊驗證碼圖片本身進行驗證碼的切換(需求一)
//生成隨機數字,便於訪問服務端,如果地址是相同的則瀏覽器不會刷新訪問
<img id="captCode" src="./code.php?=<?php echo rand();?>" width="100px;height:100px;" alt=""
onclick="this.src='code.php?+ Math.random()'">
//點擊‘點擊切換’,切換驗證碼(需求二)
<img id="captCode" src="./code.php?=--><?php //echo rand();?><!--" width="100px;height:100px;" alt="">
<a href="javascript:void(0)" onclick="document.getElementById('captCode').src='code.php?=<?php echo rand();?>'">點擊切換?</a>
</p>
<p>請輸入驗證碼的內容:
<input type="text" name="authcode" value=""/>
</p>
<P>
<input type="submit" value="提交" style="padding:6px 20px;"/>
</P>
</form>
</body>
幾點異常:
1): 如果出現亂碼的情況:header("Content-type:text/html;charset=utf-8");//避免出現亂碼的情況
2):如果驗證碼圖片不能顯示在前端:那可能是緩存的問題:
事實截圖:

