php实现验证码的识别(初级篇)

  • 时间:
  • 浏览:0
  • 来源:uu快3概率_uu快3官网pk10_平台

近期研究某些突破验证码方面的知识,记录下来。一方面是不是对这几天学习知识的总结帮助另一方理解;另一方面希望对研究这方面的技术同学有所帮助;另外也希望引起网站管理者的注意,在提供验证码时多些考虑进去。将会日后接触这方面的知识,理解比较浅显,有错误再所难免,欢迎拍砖。

验证码的作用: 有效正确处理某个黑客对某从前特定注册用户用特定程序运行暴力破解土土法子进行不断的登陆尝试。虽然现代的验证码一般是正确处理机器批量注册的,正确处理机器批量发帖回复。目前,不少网站为了正确处理用户利用机器人自动注册、登录、灌水,都采用了验证码技术。

所谓验证码,只要将一串随机产生的数字或符号,生成一幅图片,图片里加进去去某些干扰象素(正确处理OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后都还可不能能使用某项功能。

朋友 最常见的验证码

1,四位数字,随机的一数字字符串,最原始的验证码,验证作用几乎为零。

2,随机数字图片验证码。图片上的字符比较中规中矩,有的将会加入某些随机干扰素,还有某些是随机字符颜色,验证作用比上从前好。没有 基本图形图像学知识的人,不可破!

3,各种图片格式的随机数字+随机大写英文字母+随机干扰像素+随机位置。

4,汉字是注册目前最新的验证码,随机生成,打起来更难了,影响用户体验,某些,一般应用的比较少。

简单起见,朋友 这次说明的主要对象是第2种类型的,朋友 先看几种网上比较常见的某些 验证码的图片.

(不知道如保会搞的,CSDN又必须上传图片了,我把这三种图片放满去下载包中了,还可不能能下载下来对比察看)

这三种样式,基本还可不能能代表2中所提到的验证码类型,初步看起来第从前图片最容易破解,第3个次之,第从前更难,第3个最难。

真实具体情况那?虽然这三种图片破解难度相同。

第从前图片,最容易,图片背景和数字都使用相同的颜色,字符规整,字符位置统一。

第3个图片,看似不容易,虽然仔细学着发现其规则,背景色和干扰素无论如保会变化,验证字符字符规整,颜色相同,某些排除干扰素非常容易,只只要非字符色素完整排除即可。

第从前图片,看似更简化,正确处理里面提到背景色和干扰素一个劲变化外,验证字符的颜色也在变化,否则各个字符的颜色也各不相同。看似无法突破某些 验证码,本篇文章,就一某些 类型验证码为例说明,第3个图片,同学们另一方搞。

第3个图片,除了第从前图片上提到的结构外,又在文字加进去去了两条直线干扰率,看似困难虽然,很容易加进去。

验证码识别一般分为以下有几个步骤:

1. 取出字模

2. 二值化

3. 计算结构

4. 对照样本

1:取出字模

识别验证码,毕竟全是专业的OCR识别,否则,将会各个网站的验证码各不相同,某些,最常见的土土法子只要只要建立某些 验证码的结构码库。去字模时,朋友 必须多下载几张图片,使某些 图片中,包括所有的字符,朋友 这里的字母必须图片,某些,只要采集到包括0-9的图片即可。

2:二值化

二值化只要把图片上的验证数字上每个象素用三种数字表示1,某些偏离 用0表示。从前就还可不能能计算出每个数字字模,记录下某些 字模来,当作key即可。

3:计算结构

把要识别的图片,进行二值化,得到图片结构。

4:对照样本

把步骤3种的图片结构码和验证码的字模进行对比,得到验证图片上的数字。

使用目前某些 土土法子,对验证码的识别基本还可不能能不能做到5000%。

通过以上步骤,您将会说了,并没有 发现如保取出干扰素啊!虽然取出干扰素的土土法子很简单,干扰素的从前重要结构是,必须影响验证码的显示效果,某些制作干扰素时它的RGB将会低于将会高于某个特定值,比如我给的例子中的图片,干扰素的RGB各项值是不想超过125的,某些,从前朋友 就很容易加进去干扰素了。

php代码



<?php define('WORD_WIDTH',9); define('WORD_HIGHT',13); define('OFFSET_X',7); define('OFFSET_Y',3); define('WORD_SPACING',4); class valite { public function setImage($Image) { $this->ImagePath = $Image; } public function getData() { return $data; } public function getResult() { return $DataArray; } public function getHec() { $res = imagecreatefromjpeg($this->ImagePath); $size = getimagesize($this->ImagePath); $data = array(); for($i=0; $i < $size[1]; ++$i) { for($j=0; $j < $size[0]; ++$j) { $rgb = imagecolorat($res,$j,$i); $rgbarray = imagecolorsforindex($res, $rgb); if($rgbarray['red'] < 125 || $rgbarray['green']<125 || $rgbarray['blue'] < 125) { $data[$i][$j]=1; }else{ $data[$i][$j]=0; } } } $this->DataArray = $data; $this->ImageSize = $size; } public function run() { $result=""; // 查找从前数字 $data = array("","","",""); for($i=0;$i<4;++$i) { $x = ($i*(WORD_WIDTH+WORD_SPACING))+OFFSET_X; $y = OFFSET_Y; for($h = $y; $h < (OFFSET_Y+WORD_HIGHT); ++ $h) { for($w = $x; $w < ($x+WORD_WIDTH); ++$w) { $data[$i].=$this->DataArray[$h][$w]; } } } // 进行关键字匹配 foreach($data as $numKey => $numString) { $max=0.0; $num = 0; foreach($this->Keys as $key => $value) { $percent=0.0; similar_text($value, $numString,$percent); if(intval($percent) > $max) { $max = $percent; $num = $key; if(intval($percent) > 95) break; } } $result.=$num; } $this->data = $result; // 查找最佳匹配数字 return $result; } public function Draw() { for($i=0; $i<$this->ImageSize[1]; ++$i) { for($j=0; $j<$this->ImageSize[0]; ++$j) { echo $this->DataArray[$i][$j]; } echo "/n"; } } public function __construct() { $this->Keys = array( '0'=>'00015000000111115000050000011050000000115000000011500000001150000000115000000011500000001150000000110500000500001111150000001500000', '1'=>'00015000000111500000011150000000005000000000500000000050000000005000000000500000000050000000005000000000500000011111111011111111', '2'=>'011150000011111500005000000500000000015000000005000000005000000005000000005000000005000000005000000005000000000011111110111111110', '3'=>'011150000011111111050000005000000000500000000500000111500000011115000000000150000000001500000000110500000111011111500000111500000', '4'=>'00000500000000150000000015000000011500000011050000001105000005000050000050000500001111111111111111500000005000000000500000000050000', '5'=> '1111111101111111105000000000500000000050000000001115000000111115000000000150000000001500000000110500000111011111500000111500000', '6'=>'0001150000001111500005000000500050000000050000000001101150000111111110150000011150000000115000000011050000011101111150000001150000', '7'=>'011111111011111150000000005000000000500000000500000000500000000050000000050000000005000000005000000000500000000500000000050000000', '8'=>'00111500000111115000050000050000500000500001110150000011150000001115000001110111050000000115000000011150000011101111150000011150000', '9'=>'0011500000011111110150000011150000000115000000011150000011101111115000011110500000000050000000050000500000500001111500000011500000', ); } protected $ImagePath; protected $DataArray; protected $ImageSize; protected $data; protected $Keys; protected $NumStringArray; } ?> 

我做了从前例子,让我从这里下载 下载

破解完成里面的验证码,朋友 就还可不能能使用snoopy(比curl要轻量,某些我喜欢)来模拟浏览器器,访问网站了。