php Captcha验证码类

发布时间:2019-10-18编辑:脚本学堂
分享一个php实现的Captcha验证码类,简单实用的php验证码,有需要的朋友参考下,希望对大家有所帮助。

1,Captcha验证码类
 

复制代码 代码示例:
<?php 
/** Captcha 验证码类
*   Date:   2011-02-19
*   Author: fdipzone
*   Edit: www.jb200.com
*/ 
 
class Captcha{  //class start 
 
    private $sname = ''; 
 
    public function __construct($sname=''){ // $sname captcha session name 
        $this->sname = $sname==''? 'm_captcha' : $sname; 
    } 
 
 
    /** 生成验证码图片
    * @param  int   $length 驗證碼長度
    * @param  Array $param  參數
    * @return IMG
    */ 
    public function create($length=4,$param=array()){ 
        Header("Content-type: image/PNG"); 
        $authnum = $this->random($length);   //生成验证码字符. 
     
        $width  = isset($param['width'])? $param['width'] : 13;     //文字宽度 
        $height = isset($param['height'])? $param['height'] : 18;   //文字高度 
        $pnum   = isset($param['pnum'])? $param['pnum'] : 100;      //干扰象素个数 
        $lnum   = isset($param['lnum'])? $param['lnum'] : 2;        //干扰线条数 
 
        $this->captcha_session($this->sname,$authnum);                //將隨機數寫入session 
 
        $pw = $width*$length+10; 
        $ph = $height+6; 
                 
        $im = imagecreate($pw,$ph);                     //imagecreate() 新建图像,大小为 x_size 和 y_size 的空白图像。 
        $black = ImageColorAllocate($im, 238,238,238);  //设置背景颜色 
     
        $values = array( 
                mt_rand(0,$pw),  mt_rand(0,$ph), 
                mt_rand(0,$pw),  mt_rand(0,$ph), 
                mt_rand(0,$pw),  mt_rand(0,$ph), 
                mt_rand(0,$pw),  mt_rand(0,$ph), 
                mt_rand(0,$pw),  mt_rand(0,$ph), 
                mt_rand(0,$pw),  mt_rand(0,$ph) 
        ); 
        imagefilledpolygon($im, $values, 6, ImageColorAllocate($im, mt_rand(170,255),mt_rand(200,255),mt_rand(210,255)));   //設置干擾多邊形底圖 
     
        /* 文字 */ 
        for ($i = 0; $i < strlen($authnum); $i++){ 
            $font = ImageColorAllocate($im, mt_rand(0,50),mt_rand(0,150),mt_rand(0,200));//设置文字颜色 
            $x  = $i/$length * $pw + rand(1, 6);    //设置随机X坐标 
            $y  = rand(1, $ph/3);                   //设置随机Y坐标 
            imagestring($im, mt_rand(4,6), $x, $y, substr($authnum,$i,1), $font);  
        } 
 
        /* 加入干扰象素 */ 
        for($i=0; $i<$pnum; $i++){ 
            $dist = ImageColorAllocate($im, mt_rand(0,255),mt_rand(0,255),mt_rand(0,255)); //设置杂点颜色 
            imagesetpixel($im, mt_rand(0,$pw) , mt_rand(0,$ph) , $dist);  
        }  
 
        /* 加入干擾線 */ 
        for($i=0; $i<$lnum; $i++){ 
            $dist = ImageColorAllocate($im, mt_rand(50,255),mt_rand(150,255),mt_rand(200,255)); //設置線顏色 
            imageline($im,mt_rand(0,$pw),mt_rand(0,$ph),mt_rand(0,$pw),mt_rand(0,$ph),$dist); 
        } 
 
        ImagePNG($im);      //以 PNG 格式将图像输出到浏览器或文件 
        ImageDestroy($im);  //销毁一图像 
    } 
 
 
    /** 檢查驗證碼
    * @param String $captcha    驗證碼
    * @param int    $flag       驗證成功后 0:不清除session 1:清除session
    * @return boolean
    */   
    public function check($captcha,$flag=1){ 
        if(empty($captcha)){ 
            return false; 
        }else{ 
            if(strtoupper($captcha)==$this->captcha_session($this->sname)){   //檢測驗證碼 
                if($flag==1){ 
                    $this->captcha_session($this->sname,''); 
                } 
                return true; 
            }else{ 
                return false; 
            } 
        } 
    } 
     
 
    /* 产生随机数函数
    * @param    int     $length 需要隨機生成的字符串數
    * @return   String
    */ 
    private function random($length){ 
        $hash = ''; 
        $chars = 'ABCDEFGHIJKLMNPQRSTUVWXYZ23456789'; 
        $max = strlen($chars) - 1; 
        for($i = 0; $i < $length; $i++) { 
            $hash .= $chars[mt_rand(0, $max)]; 
        } 
        return $hash; 
    } 
 
 
    /** 驗證碼session處理方法
    * @param    String  $name   captcha session name
    * @param    String  $value
    * @return   String
    */ 
    private function captcha_session($name,$value=null){ 
        if(isset($value)){ 
            if($value!==''){ 
                $_SESSION[$name] = $value; 
            }else{ 
                unset($_SESSION[$name]); 
            } 
        }else{ 
            return isset($_SESSION[$name])? $_SESSION[$name] : ''; 
        } 
    } 
 
}   // class end 
?> 

2,调用示例 demo.php
 

复制代码 代码示例:
<? 
    session_start(); 
    require_once('Captcha.class.php'); 
 
    $obj = new Captcha($sname);     # 創建Captcha類對象 
                                    # $sname為保存captcha的session name,可留空,留空則為'm_captcha' 
 
    $obj->create($length,$param);    # 創建Captcha并輸出圖片 
                                    # $length為Captcha長度,可留空,默認為4 
                                    /* $param = array(
                                            'width' => 13        captcha 字符寬度
                                            'height' => 18       captcha 字符高度
                                            'pnum' => 100        干擾點個數
                                            'lnum' => 2          干擾線條數
                                            )
                                            可留空
                                    */ 
 
    $obj->check($captcha,$flag); # 檢查用戶輸入的驗證碼是否正確,true or false 
                                    # $captcha為用戶輸入的驗證碼,必填 
                                    # $flag 可留空,默認為1  
                                    #       1:當驗證成功后自動清除captcha session 
                                    #       0:當驗證成功后不清除captcha session,用於ajax檢查 
?>

>>> 您可能感兴趣的文章:
使用Zend_Captcha生成验证码的方法
用php生成带有雪花背景的验证码
php随机验证码 php生成随机验证码(图文)
php 验证码类 php 验证码
php生成验证码的例子
php GD库生成验证码的实例
php彩色验证码的简单例子
php图片验证码的例子
php点击验证码实时刷新的实现代码
php仿QQ验证码的实现代码
php验证码的三个实例代码分享
php验证码简单函数代码(附效果图)
php随机生成4位数字验证码
php验证码大全(实例分享)