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的开合式多级菜单程序
Oct 09 PHP
关于Appserv无法打开localhost问题的解决方法
Oct 16 PHP
PHP执行linux系统命令的常用函数使用说明
Apr 27 PHP
hessian 在PHP中的使用介绍
Dec 13 PHP
php继承的一个应用
Sep 06 PHP
PHP模板引擎Smarty内建函数详解
Apr 11 PHP
详解PHP用substr函数截取字符串中的某部分
Dec 03 PHP
php+redis实现多台服务器内网存储session并读取示例
Jan 12 PHP
PHP编程实现微信企业向用户付款的方法示例
Jul 26 PHP
PHP实现动态获取函数参数的方法示例
Apr 02 PHP
php实现微信企业付款到个人零钱功能
Oct 09 PHP
PHP7新增函数
Mar 09 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动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间
2016/05/06 PHP
简单谈谈PHP中的trait
2017/02/25 PHP
Alliance vs Liquid BO3 第二场2.13
2021/03/10 DOTA
翻译整理的jQuery使用查询手册
2007/03/07 Javascript
javascript下给元素添加事件的方法与代码
2007/08/13 Javascript
海量经典的jQuery插件集合
2010/01/12 Javascript
CSS和JS标签style属性对照表(方便js开发的朋友)
2010/11/11 Javascript
JS定时刷新页面及跳转页面的方法
2013/07/04 Javascript
swtich/if...else的替代语句
2015/08/16 Javascript
jQuery实现指定区域外单击关闭指定层的方法【经典】
2016/06/22 Javascript
jQuery购物网页经典制作案例
2016/08/19 Javascript
jQuery层次选择器用法示例
2016/09/09 Javascript
浅谈Node.js:fs文件系统模块
2016/12/08 Javascript
JavaScript基础之this详解
2017/06/04 Javascript
基于angular2 的 http服务封装的实例代码
2017/06/29 Javascript
vue 将页面公用的头部组件化的方法
2017/12/18 Javascript
微信小程序接入腾讯云验证码的方法步骤
2020/01/07 Javascript
maptalks+three.js+vue webpack实现二维地图上贴三维模型操作
2020/08/10 Javascript
[01:23]一分钟告诉你 DOTA2为什么叫信仰2
2014/06/20 DOTA
Python中字典和集合学习小结
2017/07/07 Python
python中requests使用代理proxies方法介绍
2017/10/25 Python
Python基于最小二乘法实现曲线拟合示例
2018/06/14 Python
python矩阵的转置和逆转实例
2018/12/12 Python
对python条件表达式的四种实现方法小结
2019/01/30 Python
浅谈PyQt5 的帮助文档查找方法,可以查看每个类的方法
2019/06/25 Python
Python实现壁纸下载与轮换
2020/10/19 Python
Python+logging输出到屏幕将log日志写入文件
2020/11/11 Python
详解HTML5布局和HTML5标签
2020/10/26 HTML / CSS
几个人围成一圈的问题
2013/09/26 面试题
Boolean b = new Boolean(“abcde”); 会编译错误码
2013/11/27 面试题
Ejb技术面试题
2015/04/29 面试题
抽样调查项目计划书
2014/04/24 职场文书
结婚保证书范文
2014/04/29 职场文书
伦敦奥运会的口号
2014/06/21 职场文书
2015年简历自我评价范文
2015/03/11 职场文书
2016年幼儿园教研活动总结
2016/04/05 职场文书