使用php生成數字、字母組合驗證碼(一)


項目中經常會遇到一些登陸驗證,支付驗證等等一系列安全驗證的策略。實現方法多種多樣,下面就來講解下如何用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):如果驗證碼圖片不能顯示在前端:那可能是緩存的問題:

事實截圖:

 

 

 

  

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM