1. 程式人生 > >php驗證碼的製作

php驗證碼的製作

現在一般的網站,類似於使用者驗證之類的都會有驗證碼驗證。就我個人的理解,驗證碼主要的作用是防止木馬之類的惡意登入。下面主要介紹一下利用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驗證碼時會遇到一些很奇怪又不知道如何解決的錯誤,對於初學者來說確實是一個難題,就像如下的錯誤,沒有具體的錯誤提示

驗證碼 出錯時的解決辦法,後續介紹...........