2018-06-19 16:38:05  298834 2

一个简单实用的验证码类

 标签:   

验证码介绍


   

      验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上用验证码是现在很多网站通行的方式,我们利用比较简易的方式实现了这个功能。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。


图片验证码组成


图片

验证码

干扰元素 : 线  点


图片验证流程


1 创建背景图片

2 生成验证码

3 画干扰元素

4 输出图片

注意需要GD


下面是一个简单的验证码类,仅供学习参考使用

class Captcha{
    
    private $width;
    
    private $height;
    
    private $str = 'abcdefghijkmnpqrstuvwxyz23456789ABCDEFGHIJKMNPQRSTUVWXYZ';
    
    private $len;
    
    private $font_dir = 'C:\Users\lampol\Desktop\php\phpstudy\PHPTutorial\WWW\php\6-19\code.ttf';
    
    private  $img;
    
    private $code;
    
    public function __construct($config=['width'=>200,'height'=>50,'len'=>4]){
        $this->width = $config['width'];
        $this->height = $config['height'];
        $this->len = $config['len'];
        
    }
    
    public function entry(){
        $this->createBg();
        $this->getCode();
        $this->setCode();
        $this->setLine();
        $this->setDot();
        $this->outImg();
    }
    
    //创建背景图片
    private function createBg(){
        $this->img = imagecreate($this->width,$this->height);
        imagecolorallocate($this->img,135,206,235);
    }
    
    //生成验证码
    
    private function getCode(){
        for ($i=0;$i<$this->len;$i++){
            $key = mt_rand(0,strlen($this->str)-1);
            $this->code.=$this->str{$key};
        }
        $this->setSession();
    }
    
    //把验证码存到session
    
    private function  setSession(){
        session_start();
        
        $_SESSION['code'] = strtolower($this->code);
        
    }
    
    //验证码 写到背景图片
    
    private function setCode(){
        
        for($i=0;$i<$this->len;$i++){
    
            $font_color = imagecolorallocate($this->img,mt_rand
            (100,255),mt_rand(100,255),mt_rand(100,255));
            
            $x = ($this->width/$this->len)*$i+5;
            
            $font_size = mt_rand(18,30);
            
            $font_height = imagefontheight($font_size);
            
            $y = mt_rand($font_height,$this->height);
            
            imagettftext($this->img,$font_size,mt_rand(-25,25),$x,$y,$font_color,
            $this->font_dir,$this->code{$i});
    
        }
        
    }
    
    //画线
    
    private  function  setLine(){
        for($i=0;$i<$this->len;$i++){
    
            $line_color = imagecolorallocate($this->img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
            imageline ($this->img,mt_rand(0,$this->width/$this->len),mt_rand(0,50),
            mt_rand($this->width-$this->width/$this->len,$this->width),mt_rand(0,50),$line_color);
            
        }

    }
    //画点
    
    private  function  setDot(){
        for($i=0;$i<100;$i++){
            
            $dot_color = imagecolorallocate($this->img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
            imagesetpixel($this->img,mt_rand(0,$this->width),mt_rand(0,$this->height),$dot_color);
            
        }
    }
    
    private  function outImg(){
        
        ob_end_clean();
        header('Content-type:image/jpeg');
        imagejpeg($this->img);
        
    }
    
    //销毁资源
    public function __destruct(){
        imagedestroy($this->img);
    }
}

//使用方法
$captcha  = new Captcha(['width'=>140,'height'=>70,'len'=>6]);

$captcha->entry();


2 条留言此文章没有人评论

给我留言

评论内容