1. 程式人生 > >使用php如何生成驗證碼

使用php如何生成驗證碼

輸出 fontsize lora 支付 () 頭文件 出圖 and utf

項目中經常會遇到一些登陸驗證,支付驗證等等一系列安全驗證的策略。實現方法多種多樣,下面就來講解下如何用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); } 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;" onclick="this.src=‘code.php?+ Math.random()‘"> //點擊‘點擊切換’,切換驗證碼(需求二) <img id="captCode" src="./code.php?=--><?php //echo rand();?><!--" width="100px;height:100px;" > <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>

  

  

  

使用php如何生成驗證碼