码迷,mamicode.com
首页 > 其他好文 > 详细

验证码类

时间:2016-07-06 13:23:39      阅读:259      评论:0      收藏:0      [点我收藏+]

标签:

php 验证码类

根据token值去获取验证码,用户并通过token + code值去验证图片验证码的是否正确;

    <?php
    /*
    * Captcha
    *
    * 验证码类库
    *
    *
    */
    class Captcha {
        //验证码图片的宽度
        private $width;
        //验证码图片的高度
        private $height;
        //验证码的个数
        private $codenum;
        //验证码
        private $code;
        //验证码token值
        private $token;
        //图片
        private $image;
        //memcache
        private $memcache;

    function __construct($width = 80,$height=20,$codenum =4) {
        $this->width = $width;
        $this->height = $height;
        $this->codenum = $codenum;
        //初始化的时候就把memcache加载进来
        $this->memcache = new Cache("SEEDIT_CAPTCHA");
    }

    //随机生成验证码,并生成一个token值
    public function createCode() {
        $str = "23456789abcdefghijkmnpqrstuvwxyzABCDEFGHIJKMNPQRSTUVWXYZ";
        for($i=0;$i<$this->codenum;$i++) {
            $this->code .= $str{rand(0,strlen($str)-1)};
        }
        $this->token = uniqid(‘code‘,true);
        $this->_saveCode($this->token,$this->code);
        return $this->token;
    }

    //输出图像的方法
    public function showImage($token) {
        $this->createImage();
        $this->code = $this->memcache->get($token);
        $this->outputText();
        $this->setDisturbColor();
        $this->outputImage();
    }

    //获取token值
    public function getToken() {
        return $this->token;
    }

    //检验验证码是否正确
    public function checkCode($token,$str) {
        if(empty($str)) {
            return false;
        }
        if(strtolower($this->memcache->get($token)) === strtolower($str)) {
            return true;
        }
        return false;
    }

    //根据token重新生产一个code
    public function refreshCode($token){
        $str = "23456789abcdefghijkmnpqrstuvwxyzABCDEFGHIJKMNPQRSTUVWXYZ";
        for($i=0;$i<$this->codenum;$i++) {
            $this->code .= $str{rand(0,strlen($str)-1)};
        }
        $this->token = $token;
        $this->_saveCode($this->token,$this->code);
        return $this->token;
    }

    //保存token和code到memcache里面
    private function _saveCode($key,$value) {
        $expires = 10*60;
        return $this->memcache->set($key,$value,$expires);
    }

    //创建图像
    private function createImage() {
        $this->image = imagecreate($this->width, $this->height);
        $background = imagecolorallocate($this->image, 255, 255, 255);
        $border = imagecolorallocate($this->image, 0, 0, 0);
        imagerectangle($this->image, 0, 0, $this->width-1, $this->height-1, $border);
    }


    //设置干扰元素
    private function setDisturbColor() {
        $number = floor(($this->width*$this->height)/15);
        $disturbnum = ($number > 250) ? 250:$number;
        for($i=0;$i<$disturbnum;$i++) {
            $color = imagecolorallocate($this->image, rand(0,255), rand(0,255), rand(0,255));
            imagesetpixel($this->image, $this->width-2, rand(1,$this->height-2), $color);
        }
        for($i=0;$i<8;$i++) {
            $color = imagecolorallocate($this->image, rand(128,255), rand(125,255), rand(100,255));
            imagearc($this->image, rand(-10,$this->width), rand(0,$this->height), rand(30,300), rand(20,200), 50, 30, $color);
        }
    }

    //随机颜色、位置、字符
    private function outputText() {
        for($i=0;$i<$this->codenum;$i++) {
            $fontcolor = imagecolorallocate($this->image, rand(0,128), rand(0,128), rand(0,128));
            $fontsize = rand(floor($this->height / 5), floor($this->height / 3));
            $x = floor($this->width/$this->codenum)*$i+10;
            $y = rand(3,$this->height-20);
            imagechar($this->image,$fontsize,$x,$y,$this->code{$i},$fontcolor);
        }
    }

    //输出图像(只提供一种格式)
    private function outputImage() {
        if (imagetypes() & IMG_JPG) {
            header(‘Content-type:image/jpeg‘);
            imagejpeg($this->image);
        } elseif (imagetypes() & IMG_GIF) {
            header(‘Content-type: image/gif‘);
            imagegif($this->image);
        } elseif (imagetype() & IMG_PNG) {
            header(‘Content-type: image/png‘);
            imagepng($this->image);
        } else {
            die("暂时不允许创建图像!");
        }
        imagedestroy($this->image);
    }

    }
    
    //===============测试验证码方法start=====================
    public function indexAction() {
        if($this->getRequest()->isPost()) {
            Yaf_Dispatcher::getInstance()->disableView();
            $code = $_POST[‘code‘];
            $token = $_COOKIE[‘code_token‘];    //演示将验证码放入cookie中
            $im = new Seedit_Captcha();
            $isfalse = $im->checkCode($token,$code);
            $array = array();
            if($isfalse) {
                $array = array(
                    ‘code‘ => $code,
                    ‘token‘ => $token,
                    ‘isfalse‘ => $isfalse
                );
            }
            echo json_encode($array);
        }
    }

    public function imageAction() {
        Yaf_Dispatcher::getInstance()->disableView();
        $image = new Captcha(100,30,4);
        $token = $image->createCode();
        setcookie(‘code_token‘,$token);
        $image->showImage($token);
    }

  

验证码类

标签:

原文地址:http://www.cnblogs.com/pengcz/p/5646517.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!