Jquery中文网 www.jquerycn.cn
Jquery中文网 >  脚本编程  >  php  >  正文 PHP生成图形验证码(加强干扰型)

PHP生成图形验证码(加强干扰型)

发布时间:2020-05-13   编辑:www.jquerycn.cn
jquery中文网为您提供PHP生成图形验证码(加强干扰型)等资源,欢迎您收藏本站,我们将为您提供最新的PHP生成图形验证码(加强干扰型)资源

验证码使用场景

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

代码

<?php  /*********************************************************************************  * InitPHP 3.8.2 国产PHP开发框架   扩展类库-验证码  *-------------------------------------------------------------------------------  * 版权所有: CopyRight By initphp.com  * 您可以自由使用该源码,但是在使用过程中,请保留作者信息。尊重他人劳动成果就是尊重自己  *-------------------------------------------------------------------------------  * Author:zhuli Dtime:2014-11-25  ***********************************************************************************/ 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();

这样即可输出如下验证码

WX20200429-205016.png

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

拓展

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

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'); }

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

以上就是PHP生成图形验证码(加强干扰型)的详细内容,更多请关注jquery中文网其它相关文章!

  • 本文原创发布jQuery中文网,转载请注明出处,感谢您的尊重!
  • 您可能感兴趣的文章:
    php图片验证码的例子
    php点击验证码实时刷新的实现代码
    PHP生成图形验证码(加强干扰型)
    php验证码大全(实例分享)
    图形数字验证代码
    php验证码的三个实例代码分享
    php生成扭曲及旋转的验证码图片的实例代码
    使用PHP生成带有干扰线的验证码,干扰点、字符倾斜详细类代码
    php5验证码类(简易实用型)
    php验证码(GD库生成验证码)的例子

    [关闭]