php驗證碼的製作
阿新 • • 發佈:2018-12-30
現在一般的網站,類似於使用者驗證之類的都會有驗證碼驗證。就我個人的理解,驗證碼主要的作用是防止木馬之類的惡意登入。下面主要介紹一下利用php語言來製作一個簡單的驗證碼。執行效果如下:
這個驗證碼主要實現了,產生一個字元和數字隨機組合的字串輸出到圖片上,點選圖片實現驗證碼切換,並且產生干擾線。使用干擾線的主要目的是防止一些程式通過掃描自動填寫驗證碼。
首先在php.ini中開啟gd2擴充套件,也就是去掉前面的分號,並重啟伺服器。
下面的工具類實現了驗證碼的輸出
<?php /**封裝驗證碼工具 * Class captohaLib */ class captchaLib{ private $length; //驗證碼長度 private $fontSize;//內建字型大小 //建構函式初始化變數 public function __construct($length=4,$fontSize=5){ $this->length=$length; $this->fontSize=$fontSize; } //生成隨機字串 private function generalCode(){ //生成有數字和字母組成的陣列 $char_array=array_merge(range('a','z'),range(0,9),range('A','Z')); //打亂陣列下標 shuffle($char_array); //從陣列中隨機去四個字元,返回陣列下標 $indexes=array_rand($char_array,$this->length); //拼接字串 $str=''; foreach ($indexes as $index) { $str.=$char_array[$index]; } return $str; } //生成驗證碼 public function generalCapctha(){ $str=$this->generalCode(); //獲取字串 $_SESSION['code']=$str; //將驗證碼放入session中,以便校驗 //設定背景圖地址 $bg_path=LIB_PATH.'captcha/captcha_bg'.rand(1,5).'.jpg'; //開啟圖片 $img=imagecreatefromjpeg($bg_path); //定義前景色 $frontColor=imagecolorallocate($img,0,0,0); switch (rand(1,5)){ case 1: $frontColor=imagecolorallocate($img,0,0,0); break; case 2: $frontColor=imagecolorallocate($img,255,255,255); break; case 3: $frontColor=imagecolorallocate($img,255,0,0); break; case 4: $frontColor=imagecolorallocate($img,0,255,0); break; case 5: $frontColor=imagecolorallocate($img,0,0,255); break; } //將字串寫到圖片上(居中顯示) $x=(imagesx($img)-imagefontwidth($this->fontSize)*strlen($str))/2; //設定x座標 $y=(imagesy($img)-imagefontheight($this->fontSize))/2; //設定y座標 imagestring($img,$this->fontSize,$x,$y,$str,$frontColor); //給圖片設定干擾線 $x1=0; //干擾線X座標起點 $x2=imagesx($img); //干擾線X座標終點 $str_y=(imagesy($img)-imagefontheight($this->fontSize))/2; //繪製干擾線 for ($i=1;$i<=2;$i++){ $y1=rand($str_y,imagefontheight($this->fontSize)); //干擾線y座標起點 $y2=rand($str_y,imagefontheight($this->fontSize)); //干擾線y座標終點 imageline($img,$x1,$y1,$x2,$y2,$frontColor); } ob_clean(); //手動清空快取 //設定圖片解釋格式 header('content-type:image/png'); //輸出圖片 imagepng($img); //銷燬資源 imagedestroy($img); } //檢查驗證碼是否正確 public function checkCaptcha($code){ return $code==$_SESSION['code']; } }
其中需要注意的是,$_SESSION['code']=$str;把產生的字串存放在session中,以便做後臺的驗證,做後臺驗證很簡單,就是獲取前臺輸入的驗證碼跟session中存放的驗證碼進行比較,程式碼如下:
if (!empty($_POST)) { //檢查驗證碼 $captcha=$_POST['captcha']; $c=new captchaLib(); if (!$c->checkCaptcha($captcha)){ $this->error('index.php?p=admin&$c=login&$a=login','驗證碼錯誤',3); exit; } ...... } ...... //獲取驗證碼 public function getGeneralCaptchaAction(){ $captcha=new captchaLib(); $captcha->generalCapctha(); }
點選圖片切換驗證碼程式碼如下,其中Math.random();是產生隨機數字進行強制重新整理:
<img src="index.php?p=admin&c=login&a=getGeneralCaptcha"
onclick="this.src='index.php?p=admin&c=login&a=getGeneralCaptcha&'+Math.random();"
alt="" width="145" height="20">
初學php驗證碼時會遇到一些很奇怪又不知道如何解決的錯誤,對於初學者來說確實是一個難題,就像如下的錯誤,沒有具體的錯誤提示
驗證碼 出錯時的解決辦法,後續介紹...........