php制作的简单验证码识别代码


Posted in PHP onJanuary 26, 2016

一直想写这个,过了很久今天兴趣来了索性记录下。

验证码

全自动区分计算机和人类的公开图灵测试(英语:Completely Automated Public Turing test to tell Computers and Humans Apart,简称CAPTCHA),俗称验证码,是一种区分用户是计算机和人的公共全自动程序。在CAPTCHA测试中,作为服务器的计算机会自动生成一个问题由用户来解答。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。
百科介绍

说的简单点就是随机生成的字符,输出在一张图片上[这里不考虑其他形式的拖拽/短信验证码等等]。

常见类型

php制作的简单验证码识别代码

思路

本文只做演示使用,故取第一张图片验证码作为讲解示例。

php制作的简单验证码识别代码

图片上的每一点都有其RGB值,通过取色器可以获取到,肉眼观察可以看出该图验证码是纯数字纯色背景

php制作的简单验证码识别代码

通过取色器看出该验证码背景色RGB值为(212,214,204)

实现

下面我们来用PHP的imagecolorsforindex函数取得图片所有点的RGB值:

$url = 'http://210.32.33.91:8080/reader/captcha.php';
$im = imagecreatefromgif($url);
imagegif($im, '1.gif');
$rgbArray = array();
$res = $im;
$size = getimagesize($url);

$wid = $size['0'];
$hid = $size['1'];
for ($i = 0; $i < $hid; ++ $i) {
 for ($j = 0; $j < $wid; ++ $j) {
  $rgb = imagecolorat($res, $j, $i);
  $rgbArray[$i][$j] = imagecolorsforindex($res, $rgb);
 }
}

结果如下:

php制作的简单验证码识别代码

各位可能想问这有什么用呢? 下面我们换一种方式来显示数据,为背景色输出,验证码区域输出,再来看下:

for ($i = 0; $i < $hid; $i ++) {
 for ($j = 0; $j < $wid; $j ++) {
  
  if ($rgbArray[$i][$j]['red'] == 212) {
   echo '□';
  } else {
   echo '■';
  }
 }
 echo "<br>";
}

效果:

php制作的简单验证码识别代码

这样一下是不是很清楚了。

但是你可能还是有疑问,尽管可以看出来了,但是如何知道是多少呢?

下面我们来分析下:

php制作的简单验证码识别代码

每个验证码直接间距4格,左右间距6/10格,上下间距16/10格。

我们再来去掉这些干扰点,可以看得更清晰些:

php制作的简单验证码识别代码

是不是很清晰了?可能还是有人会问,你讲这么多到底要怎么才能知道图片上的数字是多少.

好吧,说下我的思路,我们将刚刚的换为0和1,而这些数字形状是固定的,这样就可以得到0-9每一个字的每一个区域8*10都有0和1组成了,

php制作的简单验证码识别代码

我们再来进行每8个切分,去掉4格间距,循环得出0-9的01组合值:

php制作的简单验证码识别代码

$dic = array(
 '00011000001111000110011011000011110000111100001111000011011001100011110000011000' => 0,
 '00011000001110000111100000011000000110000001100000011000000110000001100001111110' => 1,
 '00111100011001101100001100000011000001100000110000011000001100000110000011111111' => 2,
 '01111100110001100000001100000110000111000000011000000011000000111100011001111100' => 3,
 '00000110000011100001111000110110011001101100011011111111000001100000011000000110' => 4,
 '11111110110000001100000011011100111001100000001100000011110000110110011000111100' => 5,
 '00111100011001101100001011000000110111001110011011000011110000110110011000111100' => 6,
 '11111111000000110000001100000110000011000001100000110000011000001100000011000000' => 7,
 '00111100011001101100001101100110001111000110011011000011110000110110011000111100' => 8,
 '00111100011001101100001111000011011001110011101100000011010000110110011000111100' => 9
);

得出这10个后组合成数组,每次解析图片RGB换成对应数组值就得到验证码值了。下面来演示下:

php制作的简单验证码识别代码

最后为了准确性,取100个循环看看:

php制作的简单验证码识别代码

哈哈,准确率100%

写在最后

本文的目的是为了让WEB开发者在生成验证码时注意安全,请勿用于非法目的.

代码已在github:

PHP 相关文章推荐
在PHP中利用XML技术构造远程服务(下)
Oct 09 PHP
如何从一个php文件向另一个地址post数据,不用表单和隐藏的变量的
Mar 06 PHP
php 表单提交大量数据发生丢失的解决方法
Mar 03 PHP
php GUID生成函数和类
Mar 10 PHP
CI框架中通过hook的方式实现简单的权限控制
Jan 07 PHP
如何使用php实现评委评分器
Jul 31 PHP
PHP实现的字符串匹配算法示例【sunday算法】
Dec 19 PHP
PHP使用pdo连接access数据库并循环显示数据操作示例
Jun 05 PHP
PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞的解决方案
Oct 14 PHP
laravel框架上传图片实现实时预览功能
Oct 14 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
Mar 30 PHP
PHP正则表达式之RCEService回溯
Apr 11 PHP
php文档工具PHP Documentor安装与使用方法
Jan 25 #PHP
PHP代码维护,重构变困难的4种原因分析
Jan 25 #PHP
PHP+apc+ajax实现的ajax_upload上传进度条代码
Jan 25 #PHP
PHP实现的oracle分页函数实例
Jan 25 #PHP
PHP设置头信息及取得返回头信息的方法
Jan 25 #PHP
基于命令行执行带参数的php脚本并取得参数的方法
Jan 25 #PHP
crontab无法执行php的解决方法
Jan 25 #PHP
You might like
社区(php&amp;&amp;mysql)五
2006/10/09 PHP
PHP中捕获超时事件的方法实例
2015/02/12 PHP
详解WordPress开发中的get_post与get_posts函数使用
2016/01/04 PHP
ZendFramework2连接数据库操作实例
2017/04/18 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
JS 判断代码全收集
2009/04/28 Javascript
js导出txt示例代码
2014/01/14 Javascript
js实现网页多级级联菜单代码
2015/08/20 Javascript
图解Sublime Text3使用技巧
2015/12/21 Javascript
JS+HTML5 FileReader对象用法示例
2017/04/07 Javascript
Angularjs实现上传图片预览功能
2017/09/01 Javascript
javascript如何用递归写一个简单的树形结构示例
2017/09/06 Javascript
vue中动态绑定表单元素的属性方法
2018/02/23 Javascript
vue.js与element-ui实现菜单树形结构的解决方法
2018/04/21 Javascript
详解Angular6.0使用路由步骤(共7步)
2018/06/29 Javascript
vuex2中使用mapGetters/mapActions报错的解决方法
2018/10/20 Javascript
vue中created和mounted的区别浅析
2019/08/13 Javascript
基于Node的Axure文件在线预览的实现代码
2019/08/28 Javascript
VUE注册全局组件和局部组件过程解析
2019/10/10 Javascript
[51:05]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第一局
2016/03/06 DOTA
Python运维自动化之nginx配置文件对比操作示例
2018/08/29 Python
python matplotlib实现双Y轴的实例
2019/02/12 Python
anaconda如何查看并管理python环境
2019/07/05 Python
win7下 python3.6 安装opencv 和 opencv-contrib-python解决 cv2.xfeatures2d.SIFT_create() 的问题
2019/10/24 Python
matplotlib基础绘图命令之bar的使用方法
2020/08/13 Python
Python类绑定方法及非绑定方法实例解析
2020/10/09 Python
英国家庭家具、照明和花园家具购物网站:Furniture123
2018/12/31 全球购物
成考报名单位证明范本
2014/01/16 职场文书
农民工创业典型事迹
2014/01/25 职场文书
公司总经理工作职责管理办法
2014/02/28 职场文书
小学优秀班主任事迹材料
2014/05/17 职场文书
毕业证明书
2015/06/19 职场文书
CSS 新特性 contain控制页面的重绘与重排问题
2021/04/30 HTML / CSS
教你用python实现一个无界面的小型图书管理系统
2021/05/21 Python
Python初识逻辑与if语句及用法大全
2021/08/07 Python
使用CSS实现一个搜索引擎的原理解析
2021/09/25 HTML / CSS