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 相关文章推荐
第三节 定义一个类 [3]
Oct 09 PHP
非常不错的MySQL优化的8条经验
Mar 24 PHP
php文档更新介绍
Jul 22 PHP
多个PHP中文字符串截取函数
Nov 12 PHP
PHP中构造函数和析构函数解析
Oct 10 PHP
smarty模板引擎中自定义函数的方法
Jan 22 PHP
PHP在线书签系统分享
Jan 04 PHP
php中的常用魔术方法汇总
Feb 14 PHP
php实现的redis缓存类定义与使用方法示例
Aug 09 PHP
PHP使用GD库制作验证码的方法(点击验证码或看不清会刷新验证码)
Aug 15 PHP
PHP7内核CGI与FastCGI详解
Apr 14 PHP
在PHP中实现使用Guzzle执行POST和GET请求
Oct 15 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
Zerg基本策略
2020/03/14 星际争霸
用缓存实现静态页面的测试
2006/12/06 PHP
PHP 使用pcntl和libevent 实现Timer功能
2013/10/27 PHP
析构函数与php的垃圾回收机制详解
2013/10/28 PHP
浅谈discuz密码加密的方式
2014/05/22 PHP
基于Jquery的回车成tab焦点切换效果代码(Enter To Tab )
2010/11/14 Javascript
js Array操作的最简短最容易理解方法
2013/12/09 Javascript
jsonp跨域请求数据实现手机号码查询实例分析
2015/12/12 Javascript
详解JavaScript中的构造器Constructor模式
2016/01/14 Javascript
AngularJS基础 ng-class-odd 指令示例
2016/08/01 Javascript
jQuery插件EasyUI设置datagrid的checkbox为禁用状态的方法
2016/08/05 Javascript
AngularJS表单验证中级篇(3)
2016/09/28 Javascript
基于JavaScript实现弹幕特效
2020/08/27 Javascript
十个免费的web前端开发工具详细整理
2017/09/18 Javascript
JavaScript实现树的遍历算法示例【广度优先与深度优先】
2017/10/26 Javascript
vue自定义js图片碎片轮播图切换效果的实现代码
2019/04/28 Javascript
js实现简单的打印表格
2020/01/15 Javascript
JS Thunk 函数的含义和用法实例总结
2020/04/08 Javascript
JavaScript代码实现简单计算器
2020/12/27 Javascript
Flask SQLAlchemy一对一,一对多的使用方法实践
2013/02/10 Python
Python递归函数定义与用法示例
2017/06/02 Python
pip安装py_zipkin时提示的SSL问题对应
2018/12/29 Python
决策树剪枝算法的python实现方法详解
2019/09/18 Python
python使用opencv在Windows下调用摄像头实现解析
2019/11/26 Python
Python迭代器Iterable判断方法解析
2020/03/16 Python
python 使用csv模块读写csv格式文件的示例
2020/12/02 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
2021/01/08 Python
canvas绘制图片drawImage使用方法
2020/09/15 HTML / CSS
水果花束:Fruit Bouquets
2017/12/20 全球购物
杭州信雅达系统.NET工程师面试试题
2015/02/08 面试题
《灯光》教学反思
2014/02/08 职场文书
创业培训计划书
2014/05/03 职场文书
2015羊年春节慰问信
2015/02/14 职场文书
pytorch损失反向传播后梯度为none的问题
2021/05/12 Python
欧元符号 €
2022/02/17 杂记
httpclient调用远程接口的方法
2022/08/14 Java/Android