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 将excel导入mysql
Nov 09 PHP
php中使用临时表查询数据的一个例子
Feb 03 PHP
ubuntu下编译安装xcache for php5.3 的具体操作步骤
Jun 18 PHP
php遍历文件夹所有文件子文件夹函数代码
Nov 27 PHP
Linux中为php配置伪静态
Dec 17 PHP
php写入、删除与复制文件的方法
Jun 20 PHP
PHP基于GD库的图像处理方法小结
Sep 27 PHP
phpmailer绑定邮箱的实现方法
Dec 01 PHP
Laravel 5.4因特殊字段太长导致migrations报错的解决
Oct 22 PHP
PHP中命名空间的使用例子
Mar 22 PHP
PHP单文件上传原理及上传函数的封装操作示例
Sep 02 PHP
解决windows上php xdebug 无法调试的问题
Feb 19 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获取本周,上周,本月,上月,本季度日期的代码
2009/08/05 PHP
MongoDB在PHP中的常用操作小结
2014/02/20 PHP
destoon实现调用当前栏目分类及子分类和三级分类的方法
2014/08/21 PHP
YII CLinkPager分页类扩展增加显示共多少页
2016/01/29 PHP
PHP使用pdo连接access数据库并循环显示数据操作示例
2018/06/05 PHP
如何正确使用javascript 来进行我们的程序开发
2014/06/23 Javascript
JS返回iframe中frameBorder属性值的方法
2015/04/01 Javascript
webpack+vue.js实现组件化详解
2016/10/12 Javascript
关于angularJs指令的Scope(作用域)介绍
2016/10/25 Javascript
jQuery快速高效制作网页交互特效
2017/02/24 Javascript
JavaScript实现三级联动菜单实例代码
2017/06/26 Javascript
js实现上传并压缩图片效果
2018/01/10 Javascript
详解Vue单元测试Karma+Mocha学习笔记
2018/01/31 Javascript
angular2路由之routerLinkActive指令【推荐】
2018/05/30 Javascript
JS判断用户用的哪个浏览器实例详解
2018/10/09 Javascript
layui弹出框Tab选项卡的示例代码
2019/09/04 Javascript
python optparse模块使用实例
2015/04/09 Python
使用python调用zxing库生成二维码图片详解
2017/01/10 Python
不可错过的十本Python好书
2017/07/06 Python
python实现将excel文件转化成CSV格式
2018/03/22 Python
python读取Excel实例详解
2018/08/17 Python
TensorFlow实现Logistic回归
2018/09/07 Python
Python多进程方式抓取基金网站内容的方法分析
2019/06/03 Python
python 字典操作提取key,value的方法
2019/06/26 Python
Python中的X[:,0]、X[:,1]、X[:,:,0]、X[:,:,1]、X[:,m:n]和X[:,:,m:n]
2020/02/13 Python
潘多拉意大利官方网上商城:网上选购PANDORA珠宝
2018/10/07 全球购物
美国按摩椅批发网站:Titan Chair
2018/12/27 全球购物
北美最大的参茸药食商城:德成行
2020/12/06 全球购物
会计专业毕业生自我评价
2013/09/25 职场文书
电脑专业个人求职信范文
2014/02/04 职场文书
优秀教师的感人事迹
2014/02/04 职场文书
顶碗少年教学反思
2014/02/21 职场文书
超市促销活动总结
2014/07/01 职场文书
英语专业求职信
2014/07/08 职场文书
公司员工活动策划方案
2014/08/20 职场文书
小学语文教学反思范文
2016/03/03 职场文书