栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > PHP

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

PHP 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力
验证码使用场景

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

代码

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. 接入项目验证

新建个文件,代码如下

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生成图形验证码(加强干扰型)的详细内容,更多请关注考高分网其它相关文章!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/263218.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号