最新公告
  • 欢迎您光临码农资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!加入我们
  • PHP生成图形验证码(加强干扰型)

    我们在开发系统的过程中,基本所有的系统都会涉及到登录模块,其中验证码功能是这里面必不可少的一块,是防止系统被爆破的有效途径。所谓道高一尺魔高一丈,现在的验证码越来越复杂先进,常见的字母数字验证码,行为验证码。本文详细介绍简单的字母数字验证码。

    代码:

    <?php 
    class Code 
    
    { 
        private $charset = "abcdefghjklmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789";   //随机因子 
     
        private $code;     //验证码文字 
     
        private $codelen = 4;    //验证码显示几个文字 
     
        private $width = 100;   //验证码宽度 
     
        private $height = 40;   //验证码高度 
     
        private $img;       //验证码资源句柄 
     
        private $font;     //指定的字体 
     
        private $fontsize = 20;  //指定的字体大小 
     
        private $fontcolor;     //字体颜色  随机 
     
        //构造类  编写字体 
     
        public function __construct() 
     
        { 
     
            $this->font = '/outputs/font/font.ttf'; 
     
        } 
     
        //创建4个随机码 
     
        private function createCode() 
     
        { 
     
            $_leng = strlen($this->charset) - 1; 
     
            for ($i = 1; $i <= $this->codelen; $i++) { 
     
                $this->code .= $this->charset[mt_rand(0, $_leng)]; 
     
            } 
     
    //        session_start(); 
     
    //        $_SESSION['VerifyCode'] = strtolower($this->code); 
     
            Session::set('VerifyCode', strtolower($this->code)); 
     
            return $this->code; 
     
        } 
     
        //创建背景 
     
        private function createBg() 
     
        { 
     
            //创建画布 给一个资源jubing 
     
            $this->img = imagecreatetruecolor($this->width, $this->height); 
     
            //背景颜色 
     
            $color = imagecolorallocate($this->img, mt_rand(157, 255), mt_rand(157, 255), mt_rand(157, 255)); 
     
            //画出一个矩形 
     
            imagefilledrectangle($this->img, 0, $this->height, $this->width, 0, $color); 
     
        } 
     
        //创建字体 
     
        private function createFont() 
     
        { 
     
            $_x = ($this->width / $this->codelen);   //字体长度 
     
            for ($i = 0; $i < $this->codelen; $i++) { 
     
                //文字颜色 
     
                $color = imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156)); 
     
                //资源句柄 字体大小 倾斜度 字体长度  字体高度  字体颜色  字体  具体文本 
     
                imagettftext($this->img, $this->fontsize, mt_rand(-30, 30), $_x * $i + mt_rand(1, 5), $this->height / 1.4, $color, $this->font, $this->code[$i]); 
     
            } 
     
        } 
     
     
     
        //随机线条 
     
        private function createLine() 
     
        { 
     
            //随机线条 
     
            for ($i = 0; $i < 6; $i++) { 
     
                $color = imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156)); 
     
                imageline($this->img, mt_rand(0, $this->width), mt_rand(0, $this->height), mt_rand(0, $this->width), mt_rand(0, $this->height), $color); 
     
            } 
     
            //随机雪花 
     
            for ($i = 0; $i < 45; $i++) { 
     
                $color = imagecolorallocate($this->img, mt_rand(220, 255), mt_rand(220, 255), mt_rand(220, 255)); 
     
                imagestring($this->img, mt_rand(1, 5), mt_rand(0, $this->width), mt_rand(0, $this->height), '*', $color); 
     
            } 
     
        } 
     
     
     
        //输出背景 
     
        private function outPut() 
     
        { 
     
            //生成标头 
     
            header('Content-type:image/png'); 
     
            //输出图片 
     
            imagepng($this->img); 
     
            //销毁结果集 
     
            imagedestroy($this->img); 
     
        } 
     
        //对外输出 
     
        public function doimg() 
     
        { 
     
            //加载背景 
     
            $this->createBg(); 
     
            //加载文件 
     
            $this->createCode(); 
     
            //加载线条 
     
            $this->createLine(); 
     
            //加载字体 
     
            $this->createFont(); 
     
            //加载背景 
     
            $this->outPut(); 
     
        } 
     
     
     
        //获取验证码 
     
        public function getCode() 
     
        { 
     
            return strtolower($this->code); 
     
        } 
     
        //验证验证码 
     
        public function checkCode($code, $clear = false) 
     
        { 
     
    //        session_start(); 
     
            if (Session::get('VerifyCode') == strtolower($code)) { 
     
                if($clear) $this->clearCode(); 
     
                return true; 
     
            } 
     
            if($clear) $this->clearCode(); 
     
            return false; 
     
        } 
     
        //清除验证码 
     
        public function clearCode() 
     
        { 
     
            Session::del('VerifyCode'); 
     
    //        session_start(); 
     
    //        unset ($_SESSION['VerifyCode']); 
     
        } 
     
    } 

    验证:

    ob_clean();

    $verify = new Code();

    $verify->doimg();

    可以调整参数控制验证码的大小,干扰项等。

    拓展

    接下来介绍下拓展的功能,怎么加强验证码的干扰项,怎么结合到项目丽进行登录验证。

    1. 加强干扰

    首先我们可以看到上面的截图中少数线条,如果外者使用分析工具来解码,那么会很简单的就解出我们的验证码,这时候就需要添加线条的数量,在代码中找到以下代码并修改

    //随机线条 
     
    private function createLine() 
     
    { 
     
        //随机线条  
     
        for ($i = 0; $i < 6; $i++) { 
     
            $color = imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156)); 
     
            imageline($this->img, mt_rand(0, $this->width), mt_rand(0, $this->height), mt_rand(0, $this->width), mt_rand(0, $this->height), $color); 
     
        } 
     
        //随机雪花 
     
        for ($i = 0; $i < 45; $i++) { 
     
            $color = imagecolorallocate($this->img, mt_rand(220, 255), mt_rand(220, 255), mt_rand(220, 255)); 
     
            imagestring($this->img, mt_rand(1, 5), mt_rand(0, $this->width), mt_rand(0, $this->height), '*', $color); 
     
        } 
     
    } 

    上面的数字6可以慢慢调整,然后查看效果直到满意。同时可以看到验证码中有很多雪花效果,这个也是干扰项,可以修改上面的数字45来调整到自己满意的结果。

    注意:代码中的$charset变量,验证码是从这边随机取字符来生存验证,由于小写的i和L展示的效果很难分辨,所以我们去除了i字符。

    2. 接入项目验证

    新建个文件,代码如下

    <?php 
     
    ob_clean(); 
     
    $verify = new Code(); 
     
    $verify->doimg(); 

    然后在现有的系统登录页面引入这个接口即可展示验证码,在用户填写提交之后,服务端做以下验证

    //验证验证码 
     
    public function checkCode($code, $clear = false) 
     
    { 
     
        if (Session::get('VerifyCode') == strtolower($code)) { 
     
            if($clear) $this->clearCode(); 
     
                return true; 
     
        } 
     
        if($clear) $this->clearCode(); 
     
        return false; 
     
    } 
     
    //清除验证码 
     
    public function clearCode() 
     
    { 
     
        Session::del('VerifyCode'); 
     
    } 

    至此,验证码的生成以及验证流程都已完成。

    想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
    本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
    如有侵权请发送邮件至1943759704@qq.com删除

    码农资源网 » PHP生成图形验证码(加强干扰型)
    • 7会员总数(位)
    • 25846资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 293稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情