广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP验证码识别的示例分析
  • 504
分享到

PHP验证码识别的示例分析

2023-06-14 20:06:51 504人浏览 八月长安
摘要

这篇文章主要介绍PHP验证码识别的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php有什么用php是一个嵌套的缩写名称,是英文超级文本预处理语言,它的语法混合了C、Java、Perl以及php自创新的语法,

这篇文章主要介绍PHP验证码识别的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

php有什么用

php是一个嵌套的缩写名称,是英文超级文本预处理语言,它的语法混合了C、Java、Perl以及php自创新的语法,主要用来做网站开发,许多小型网站都用php开发,因为php是开源的,从而使得php经久不衰。

网站的登陆页、注册页等等等到处都是验证码,然而你的验证码真的安全么?也许只需要一段简单的小程序,你的验证码就会如同虚设。本文只是简单实现,不会太过深入。

有攻就有防

写这篇文章完全是因为同事的公众号发了一篇文章叫"实践-写个验证码",你简单写了一下,我就简单破解一下试试,生活处处有乐趣啊~

生成验证码

Copy代码,执行,生成如下验证码:

PHP验证码识别的示例分析

如图我们能发现,这个验证码格式特别"规范",字体大小一样,颜色都是黑色,让我们省了不少事儿。

二值化

程序读图,二值化(关键点在于查找字体颜色的阈值,这个验证码都是黑色,so...),通过程序一个像素点一个像素点判断,将属于字体颜色的标记为*,非字体颜色标记为0

PHP验证码识别的示例分析

<center>从上面的图,能够大概看出验证码的样子(YTAD)</center>

分析图像,切割

切割出字符串(先切绿线,再分别切蓝线,这样即使这个字符上下移动一下,也不太容易影响我们的切割)

PHP验证码识别的示例分析

提取特征码

将字符串拆分后,我们多次获取验证码,将a-z,A-Z,0-9等验证码的特征码全部记录下来。

PHP验证码识别的示例分析

<center>这个是提取出来的字母Y</center>

识别

识别的过程就是重复上面的:二值化->切割->提取特征码,再加上和之前提取的特征码比对相似度,就OK了。

PHP代码实现

class vCode{    //字符特征码    private $_WordKeys = array (        'A' => '000**00000****000**00**0**0000****0000****0000************0000****0000****0000**',        'B' => '******00**000**0**0000****000**0******00**000**0**0000****0000****000**0******00',        'C' => '00*****00**000****00000***000000**000000**000000**000000**00000*0**000**00*****0',        'D' => '******00**000**0**0000****0000****0000****0000****0000****0000****000**0******00',        'E' => '*********00000**00000**00000******0**00000**00000**00000**00000*******',        'F' => '**********000000**000000**000000******00**000000**000000**000000**000000**000000',        'G' => '00*****00**000****000000**000000**000000**000*****0000****0000**0**000**00*****0',        'H' => '**0000****0000****0000****0000************0000****0000****0000****0000****0000**',        'I' => '******00**0000**0000**0000**0000**0000**0000**0000**00******',        'J' => '00****0000**0000**0000**0000**0000**0000***000****0**00***00',        'K' => '**0000****000**0**00**00**0**000****0000****0000**0**000**00**00**000**0**0000**',        'L' => '**00000**00000**00000**00000**00000**00000**00000**00000**00000*******',        'M' => '**0000*****00*************0**0****0**0****0**0****0000****0000****0000****0000**',        'N' => '**0000*****000******00******00****0**0****0**0****00******000*****000*****0000**',        'P' => '*******0**0000****0000****0000*********0**000000**000000**000000**000000**000000',        'Q' => '00****000**00**0**0000****0000****0000****0000****0**0****00****0**00**000****0*',        'R' => '*******0**0000****0000****0000*********0*****000**00**00**000**0**0000****0000**',        'S' => '0******0**0000****000000**0000000******0000000**000000**000000****0000**0******0',        'T' => '********000**000000**000000**000000**000000**000000**000000**000000**000000**000',        'U' => '**0000****0000****0000****0000****0000****0000****0000****0000**0**00**000****00',        'V' => '**0000****0000****0000**0**00**00**00**00**00**000****0000****00000**000000**000',        'W' => '**0000****0000****0000****0000****0**0****0**0****0**0*************00*****0000**',        'X' => '**0000****0000**0**00**000****00000**000000**00000****000**00**0**0000****0000**',        'Y' => '**0000****0000**0**00**000****00000**000000**000000**000000**000000**000000**000',        'Z' => '*******00000**00000**0000**0000**0000**0000**0000**00000**00000*******',        'a' => '00*****00**000**000000**0*********0000****000***0****0**',        'b' => '**000000**000000**000000**0***00***00**0**0000****0000****0000*****00**0**0***00',        'c' => '00*****00**000****000000**000000**0000000**000**00*****0',        'd' => '000000**000000**000000**00***0**0**00*****0000****0000****0000**0**00***00***0**',        'e' => '00****000**00**0**0000************0000000**000**00*****0',        'f' => '000****000**00**00**00**00**000000**0000******0000**000000**000000**000000**0000',        'g' => '0*****0***000*****000**0**000**00*****00**0000000******0**0000**0******0',        'h' => '**000000**000000**000000**0***00***00**0**0000****0000****0000****0000****0000**',        'i' => '00**0000**000000000***0000**0000**0000**0000**0000**00******',        'k' => '**00000**00000**00000**00**0**0**00****000****000**0**00**00**0**000**',        'l' => '***00**00**00**00**00**00**00**00**0****',        'm' => '*0**0**0**0**0****0**0****0**0****0**0****0**0****0**0**',        'n' => '**0***00***00**0**0000****0000****0000****0000****0000**',        'o' => '00****000**00**0**0000****0000****0000**0**00**000****00',        'p' => '**0***00***00**0**0000****0000****0000*****00**0**0***00**000000**000000',        'q' => '00***0**0**00*****0000****0000****0000**0**00***00***0**000000**000000**',        'r' => '**0****00***00**0**000000**000000**000000**000000**00000',        's' => '0******0**0000****0000000******0000000****0000**0******0',        't' => '00**000000**0000******0000**000000**000000**000000**000000**00**000****0',        'u' => '**0000****0000****0000****0000****0000**0**00***00***0**',        'v' => '**0000****0000**0**00**00**00**000****0000****00000**000',        'w' => '**0000****0000****0**0****0**0****0**0**********0**00**0',        'x' => '**0000**0**00**000****00000**00000****000**00**0**0000**',        'y' => '**0000****0000****0000****0000****0000**0**00***00***0***00000**0******0',        'z' => '******0000**000**000**000**000**0000******',        '0' => '000**00000****000**00**0**0000****0000****0000****0000**0**00**000****00000**000',        '1' => '00**000***00****0000**0000**0000**0000**0000**0000**00******',        '2' => '00****000**00**0**0000**000000**00000**00000**00000**00000**00000**00000********',        '3' => '0*****00**000**0000000**00000**0000***0000000**0000000**000000****000**00*****00',        '4' => '00000**00000***0000****000**0**00**00**0**000**0********00000**000000**000000**0',        '5' => '*******0**000000**000000**0***00***00**0000000**000000****0000**0**00**000****00',        '6' => '00****000**00**0**0000*0**000000**0***00***00**0**0000****0000**0**00**000****00',        '7' => '********000000**000000**00000**00000**00000**00000**00000**00000**000000**000000',        '8' => '00****000**00**0**0000**0**00**000****000**00**0**0000****0000**0**00**000****00',        '9' => '00****000**00**0**0000****0000**0**00***00***0**000000**0*0000**0**00**000****00',    );        public function make($verCode = '') {        if(empty($verCode)) {            $baseChars     = 'ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789';            $verCode       = '';            $codeCharLenth = 4;            for ($i = 1; $i <= $codeCharLenth; $i++) {                // 通过字符串下标形式随机获取                $verCode .= $baseChars{mt_rand(0, strlen($baseChars) - 1)};            }        }        // 以下代码是将生成的验证码生成图片        $font_size = 20;        $width     = 60;        $height    = 30;        $img       = imagecreate($width, $height); // 新建一个基于调色板的图像        $bgR        = mt_rand(50, 200); //r(ed)        $bgG        = mt_rand(50, 200); //g(reen)        $bgB        = mt_rand(50, 200); //b(lue)        $background = imagecolorallocate($img, $bgR, $bgG, $bgB); // 背景色        $black      = imagecolorallocate($img, 0, 0, 0);        imagestring($img, 5, 9, 8, $verCode, $black); // 水平地画一行字符串        ob_start();        imagepng($img);        $image = ob_get_contents();        ob_end_clean();        return array(            'image' =>  $image,            'code'  =>  $verCode        );    }        public function getImage($imageString) {        $im = imagecreatefromstring($imageString);        list($width, $height) = getimagesizefromstring($imageString);        $image = array();        for($x = 0;$x < $width;$x++) {            for($y =0;$y < $height;$y++) {                $rgb = imagecolorat($im, $x, $y);                $rgb = imagecolorsforindex($im, $rgb);                if($rgb['red'] == 0 && $rgb['green'] == 0 && $rgb['blue'] == 0) {                    $image[$y][$x] = '*';                } else {                    $image[$y][$x] = 0;                }            }        }        return $image;    }        public function remove($image) {        //计算x和y轴的        $xCount = count($image[0]); //60        $yCount = count($image); //30        $xFilter = array();        for($x = 0;$x < $xCount;$x++) {            $filter = true;            for($y = 0;$y < $yCount;$y++) {                $filter = $filter && ($image[$y][$x] == '0');            }            if($filter) {                $xFilter[] = $x;            }        }        //有字符的列        $xImage = array_values(array_diff(range(0, 59), $xFilter));        //存放关键字        $wordImage = array();        $preX = $xImage[0] - 1;        $wordCount = 0;        foreach($xImage as $xKey => $x) {            if($x != ($preX + 1)) {                $wordCount++;            }            $preX = $x;            for($y = 0;$y < $yCount;$y++) {                $wordImage[$wordCount][$y][$x] = $image[$y][$x];            }        }        foreach($wordImage as $key=>$image) {            $wordImage[$key] = $this->removeByLine($image);        }        return $wordImage;    }        public function removeByLine($image) {        $isFilter = false;        foreach($image as $y => $yImage) {            if($isFilter == true || array_filter($yImage)) {                $isFilter = true;            } else {                unset($image[$y]);            }        }        krsort($image);        $isFilter = false;        foreach($image as $y => $yImage) {            if($isFilter == true || array_filter($yImage)) {                $isFilter = true;            } else {                unset($image[$y]);            }        }        ksort($image);        return $image;    }        public function getWordString($wordImage) {        $wordString = '';        foreach($wordImage as $image) {            foreach($image as $string) {                $wordString .= $string;            }        }        return $wordString;    }        public function match($image) {        $match = array(            'min' => '',            'key' => ''        );        foreach($this->_wordKeys as $k => $v) {            $percent = 0.0;            similar_text($this->getWordString($image), $v, $percent);            if($match['min'] == '') {                $match['min'] = $percent;                $match['key'] = $k;            } else {                if($percent > $match['min']) {                    $match['min'] = $percent;                    $match['key'] = $k;                }            }        }        return $match;    }        public function show($image) {        foreach($image as $xImage) {            foreach($xImage as $yImage) {                echo $yImage;            }            echo PHP_EOL;        }        echo PHP_EOL;    }}$vCode = new vCode();$codeImage = $vCode->make();$imageString = $codeImage['image'];$image = $vCode->getImage($imageString);//原图$vCode->show($image);//去除干扰边框、拆字$newImage = $vCode->remove($image);$word = array();$code = '';foreach($newImage as $image) {    $vCode->show($image);    $code .= $vCode->match($image)['key'];}echo "生成的验证码为:{$codeImage['code']}" . PHP_EOL;echo "识别的验证码为:{$code}" . PHP_EOL;

运行结果:

PHP验证码识别的示例分析

以上是“PHP验证码识别的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网PHP编程频道!

--结束END--

本文标题: PHP验证码识别的示例分析

本文链接: https://www.lsjlt.com/news/275094.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PHP验证码识别的示例分析
    这篇文章主要介绍PHP验证码识别的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php有什么用php是一个嵌套的缩写名称,是英文超级文本预处理语言,它的语法混合了C、Java、Perl以及php自创新的语法,...
    99+
    2023-06-14
  • opencv+tesseract实现验证码识别的示例
    目录一、需要识别的内容二、直接调用tesseract来完成识别(识别率很差)三、训练数据样本,提升识别率 四、生成样本库字体五、通过Opencv清除图片的多余杂质(Java...
    99+
    2022-11-11
  • python ocr简单示例之识别验证码
    最终运行效果: OCR(optical character recognition)文字识别是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,然后用字符识别方法将形状翻译成计...
    99+
    2023-01-16
    python识别验证码 Python OCR 库
  • 手机OCR证件识别的示例分析
    这篇文章给大家分享的是有关手机OCR证件识别的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。互联网的高速发展,让保险业拓宽了渠道,呈现出新的服务模式,让互联网保险开始沸腾起来,再加上形势和政策等多重刺激下...
    99+
    2023-06-02
  • python通过pillow识别动态验证码的示例代码
    目录环境配置 安装 pillow(PIL)库识别过程生活中,我们在登录微博,邮箱的时候,常常会碰到验证码。在工作时,如果想要爬取一些数据,也会碰到验证码的阻碍。本次试验将带领大家认识...
    99+
    2022-11-12
  • python验证码识别的实例详解
    其实关于验证码识别涉及很多方面的内容,入手难度大,但是入手后,可拓展性又非常广泛,可玩性极强,成就感也很足,对这感兴趣的朋友们下面跟着小编一起来学习学习吧。 依赖 sudo apt-get instal...
    99+
    2022-06-04
    验证码 详解 实例
  • Python验证码识别处理实例
    一、准备工作与代码实例 (1)安装PIL:下载后是一个exe,直接双击安装,它会自动安装到C:Python27Libsite-packages中去, (2)pytesser:下载解压后直接放C:Python...
    99+
    2022-06-04
    验证码 实例 Python
  • Python破解极验滑动验证码的示例分析
    这篇文章将为大家详细讲解有关Python破解极验滑动验证码的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。极验滑动验证码以上图片是最典型的要属于极验滑动认证了,极验官网:http://www.ge...
    99+
    2023-06-15
  • laravel中csrf验证的示例分析
    这篇文章主要介绍laravel中csrf验证的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!laravel csrf验证总结前言问题:laravel 在web路由下无论是表单提交啊 还是ajax请求啊 只要是...
    99+
    2023-06-14
  • ThinkPHP邮箱验证的示例分析
    这篇文章将为大家详细讲解有关ThinkPHP邮箱验证的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先数据表的结构为:思路就是用户注册时候我们使用一个type的...
    99+
    2022-10-19
  • Thinkphp5中验证器的示例分析
    小编给大家分享一下Thinkphp5中验证器的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!验证器的使用方法比较简单,主要是我们需要去先定义好验证规则,T...
    99+
    2023-06-15
  • Vue插件之滑动验证码的示例分析
    小编给大家分享一下Vue插件之滑动验证码的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!预览目前仅前端实现,支持移动端滑...
    99+
    2022-10-19
  • nginx添加账号密码验证的示例分析
    这篇文章主要介绍了nginx添加账号密码验证的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。nginx添加账号密码验证server&...
    99+
    2022-10-19
  • Python语音识别的示例分析
    这篇文章给大家分享的是有关Python语音识别的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。概述将开启一个新的深度学习章节, 为大家来讲述一下深度学习在语音识别 (Speech Recognition)...
    99+
    2023-06-25
  • ZXing.Net.Mobile无法识别较大的条码的示例分析
    这篇文章将为大家详细讲解有关ZXing.Net.Mobile无法识别较大的条码的示例分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。ZXing.Net.Mobile无法识别较大的条码在Xa...
    99+
    2023-06-04
  • capcha 网站验证码趋势发展的示例分析
    这期内容当中小编将会给大家带来有关capcha 网站验证码趋势发展的示例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。最先想要解决这一问题的是雅虎&mdash;&mdash;作为互联网...
    99+
    2023-06-12
  • jQuery表单验证之密码确认的示例分析
    这篇文章给大家分享的是有关jQuery表单验证之密码确认的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。代码:<!DOCTYPE html> <...
    99+
    2022-10-19
  • element-ui中form验证的示例分析
    这篇文章主要介绍了element-ui中form验证的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。当我们添加required验证后...
    99+
    2022-10-19
  • vuelidate对于vueJs2.0验证的示例分析
    这篇文章将为大家详细讲解有关vuelidate对于vueJs2.0验证的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。介绍在后端项目里 比如我们的Laravel框...
    99+
    2022-10-19
  • Python OpenCV图像识别的示例分析
    小编给大家分享一下Python OpenCV图像识别的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、人脸识别主要有以下两种实现方法:哈尔(Haar)级联法:专门解决人脸识别而推出的传统算法;实现步骤:...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作