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 相关文章推荐
拼音码表的生成
Oct 09 PHP
PHP 和 MySQL 基础教程(三)
Oct 09 PHP
PHP自动更新新闻DIY
Oct 09 PHP
php中看实例学正则表达式
Dec 25 PHP
php图片验证码代码
Mar 27 PHP
php+mysql 实现身份验证代码
Mar 24 PHP
Windows下XDebug 手工配置与使用说明
Jul 11 PHP
php数组(array)输出的三种形式详解
Jun 05 PHP
多个PHP中文字符串截取函数
Nov 12 PHP
qq登录,新浪微博登录接口申请过程中遇到的问题
Jul 22 PHP
php抽象类使用要点与注意事项分析
Feb 09 PHP
WordPress中&quot;无法将上传的文件移动至&quot;错误的解决方法
Jul 01 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语法(2)
2006/10/09 PHP
用PHP实现小型站点广告管理(修正版)
2006/10/09 PHP
PHP为表单获取的URL 地址预设 http 字符串函数代码
2010/05/26 PHP
PHP查找与搜索数组元素方法总结
2015/06/12 PHP
PHP简单创建压缩图的方法
2016/08/24 PHP
比较不错的JS/JQuery显示或隐藏文本的方法
2014/02/13 Javascript
JQuery EasyUI 加载两次url的原因分析及解决方案
2014/08/18 Javascript
JavaScript+CSS实现仿天猫侧边网页菜单效果
2015/08/25 Javascript
不间断循环滚动效果的实例代码(必看篇)
2016/10/08 Javascript
angular2+node.js express打包部署的实战
2017/07/27 Javascript
jQuery实现为动态添加的元素绑定事件实例分析
2018/09/07 jQuery
详解React服务端渲染从入门到精通
2019/03/28 Javascript
vue element ui validate 主动触发错误提示操作
2020/09/21 Javascript
[46:20]CHAOS vs Alliacne 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
vc6编写python扩展的方法分享
2014/01/17 Python
python使用xauth方式登录饭否网然后发消息
2014/04/11 Python
python中assert用法实例分析
2015/04/30 Python
使用Python实现windows下的抓包与解析
2018/01/15 Python
python 高效去重复 支持GB级别大文件的示例代码
2018/11/08 Python
Python多进程编程常用方法解析
2020/03/26 Python
python的Jenkins接口调用方式
2020/05/12 Python
python使用Windows的wmic命令监控文件运行状况,如有异常发送邮件报警
2021/01/30 Python
手工制作的意大利太阳镜和光学元件:Illesteva
2019/01/19 全球购物
写一个用矩形法求定积分的通用函数
2012/11/08 面试题
Shell脚本如何向终端输出信息
2014/04/25 面试题
大学自主招生自荐信
2013/12/16 职场文书
班级团队活动方案
2014/08/14 职场文书
财务负责人岗位职责
2015/02/03 职场文书
工作会议通知
2015/04/15 职场文书
深入理解Vue的数据响应式
2021/05/15 Vue.js
python 提取html文本的方法
2021/05/20 Python
pycharm部署django项目到云服务器的详细流程
2021/06/29 Python
2021年国漫热度排行前十,完美世界上榜,第四是美国动画作品
2022/03/18 国漫
Java 垃圾回收超详细讲解记忆集和卡表
2022/04/08 Java/Android
PostgreSQL数据库去除重复数据和运算符的基本查询操作
2022/04/12 PostgreSQL
一文教你快速生成MySQL数据库关系图
2022/06/28 Redis