转载来源于:http://blog.csdn.net/ugg/archive/2009/03/03/3953137.aspx
近期研究一些突破验证码方面的知识,记录下来。一方面算是对这几天学习知识的总结帮助自己理解;另一方面希望对研究这方面的技术同学有所帮助;另外
也希望引起网站管理者的注意,在提供验证码时多些考虑进去。由于刚刚接触这方面的知识,理解比较浅显,有错误再所难免,欢迎拍砖。
验证码的作用: 有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试。其实现代的验证码一般是防止机器批量注册的,防止机器批量发帖回复。目前,不少网站为了防止用户利用机器人自动注册、登录、灌水,都采用了验证码技术。
所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。
我们最常见的验证码
1,四位数字,随机的一数字字符串,最原始的验证码,验证作用几乎为零。
2,随机数字图片验证码。图片上的字符比较中规中矩,有的可能加入一些随机干扰素,还有一些是随机字符颜色,验证作用比上一个好。没有基本图形图像学知识的人,不可破!
3,各种图片格式的随机数字+随机大写英文字母+随机干扰像素+随机位置。
4,汉字是注册目前最新的验证码,随机生成,打起来更难了,影响用户体验,所以,一般应用的比较少。
简单起见,我们这次说明的主要对象是第2种类型的,我们先看几种网上比较常见的这种验证码的图片.
这三种样式,基本上能代表2中所提到的验证码类型,初步看起来第一个图片最容易破解,第二个次之,第三个更难,第四个最难。
真实情况那?其实这三种图片破解难度相同。
第一个图片,最容易,图片背景和数字都使用相同的颜色,字符规整,字符位置统一。
第二个图片,看似不容易,其实仔细研究会发现其规则,背景色和干扰素无论怎么变化,验证字符字符规整,颜色相同,所以排除干扰素非常容易,只要是非字符色素全部排除即可。
第三个图片,看似更复杂,处理上面提到背景色和干扰素一直变化外,验证字符的颜色也在变化,并且各个字符的颜色也各不相同。看似无法突破这个验证码,本篇文章,就一这种类型验证码为例说明,第四个图片,同学们自己搞。
第四个图片,除了第三个图片上提到的特征外,又在文字上加了两条直线干扰率,看似困难其实,很容易去掉。
验证码识别一般分为以下几个步骤:
1. 取出字模
2. 二值化
3. 计算特征
4. 对照样本
1:取出字模
识别验证码,毕竟不是专业的OCR识别,并且,由于各个网站的验证码各不相同,所以,最常见的方法就是就是建立这个验证码的特征码库。去字模时,我们需要多下载几张图片,使这些图片中,包括所有的字符,我们这里的字母只有图片,所以,只要收集到包括0-9的图片即可。
2:二值化
二值化就是把图片上的验证数字上每个象素用一种数字表示1,其他部分用0表示。这样就可以计算出每个数字字模,记录下这些字模来,当作key即可。
3:计算特征
把要识别的图片,进行二值化,得到图片特征。
4:对照样本
把步骤3种的图片特征码和验证码的字模进行对比,得到验证图片上的数字。
使用目前这种方法,对验证码的识别基本上可以做到100%。
通
过以上步骤,您可能说了,并没有发现如何取出干扰素啊!其实取出干扰素的方法很简单,干扰素的一个重要特征是,不能影响验证码的显示效果,所以制作干扰素
时它的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'
=>
'000111000011111110011000110110000011110000011110000011110000011110000011110000011110000011011000110011111110000111000'
,
- '1'
=>
'000111000011111000011111000000011000000011000000011000000011000000011000000011000000011000000011000011111111011111111'
,
- '2'
=>
'011111000111111100100000110000000111000000110000001100000011000000110000001100000011000000110000000011111110111111110'
,
- '3'
=>
'011111000111111110100000110000000110000001100011111000011111100000001110000000111000000110100001110111111100011111000'
,
- '4'
=>
'000001100000011100000011100000111100001101100001101100011001100011001100111111111111111111000001100000001100000001100'
,
- '5'
=>
- '111111110111111110110000000110000000110000000111110000111111100000001110000000111000000110100001110111111100011111000'
,
- '6'
=>
'000111100001111110011000010011000000110000000110111100111111110111000111110000011110000011011000111011111110000111100'
,
- '7'
=>
'011111111011111111000000011000000010000000110000001100000001000000011000000010000000110000000110000001100000001100000'
,
- '8'
=>
'001111100011111110011000110011000110011101110001111100001111100011101110110000011110000011111000111011111110001111100'
,
- '9'
=>
'001111000011111110111000111110000011110000011111000111011111111001111011000000011000000110010000110011111100001111000'
,
- );
- }
- protected
$ImagePath
;
- protected
$DataArray
;
- protected
$ImageSize
;
- protected
$data
;
- protected
$Keys
;
- protected
$NumStringArray
;
- }
- ?>
- 我做了一个例子,你可以从这里下载 下载
破解完成上面的验证码,我们就可以使用snoopy(比curl要轻量,所以我喜欢)来模拟浏览器器,访问网站了。
分享到:
相关推荐
在测试案例"ceshi-demo1"中,可能包含了一个简单的PHP实现验证码识别的代码示例。这可能涵盖上述步骤的部分或全部,并且已经过测试,证明可以运行。为了进一步理解这个案例,你需要查看源代码,理解其工作原理并根据...
本文将深入探讨如何使用PHP实现验证码的自动识别,这是一项中级技术挑战,涉及到图像处理、模式识别以及机器学习等概念。 验证码自动识别通常分为几个步骤:图像预处理、特征提取、模式识别和验证。首先,我们需要...
总的来说,这些资源为学习和实践PHP验证码识别提供了一个起点,但要实现高效且准确的识别,开发者需要不断优化图像处理算法,增加字符库,甚至引入深度学习技术来提高识别性能。在实际应用中,考虑使用现有的开源库...
本主题将详细探讨验证码识别,特别是如何使用C#、VB.NET和PHP等编程语言实现智能识别验证码。 验证码,全称全自动区分计算机和人类的图灵测试(CAPTCHA),其主要设计目的是区分用户是真实的、有意识的人还是无意识...
在这个PHP验证码识别源码中,checkcode文件可能是主要的源代码文件,包含了上述各个步骤的实现。源码可能包含对图像的预处理函数、字符分割算法、识别逻辑以及错误处理机制。要深入理解并运用这个源码,你需要具备...
总之,PHP验证码识别涉及到图像处理、模式识别和机器学习等多个IT领域,理解并掌握这一技术有助于提升我们在网络安全和自动化测试方面的专业能力。通过分析和实践提供的源码,我们可以深入了解验证码识别的实现过程...
近期研究一些突破验证码方面的知识,记录下来。一方面算是对这几天学习知识的总结帮助自己理解;另一方面希望对研究这方面的技术同学有所帮助;另外也希望引起网站管理者的注意,在提供验证码时多些考虑进去。由于...
综上所述,这个压缩包内容涵盖了验证码识别技术的基本流程,包括训练、识别和PHP实现,对理解验证码识别技术及其在PHP环境中的应用具有重要价值。学习并掌握这些知识点,可以提升我们在Web安全和自动化处理领域的...
这个php实现验证码中级篇,增加二值化去杂点的操作,解决两个字符粘连问题,可以识别旋转字符,并且具有一定的学习功能,并提供了bmp到jpeg的转换方法,目前这个方案应该可以应付90%的互联网验证码识别工作。...
php图形验证码识别keys,程序是网上有
可以识别旋转字符,并且具有一定的学习功能,并提供了bmp到jpeg的转换方法,目前这个方案应该可以应付90%的互联网验证码识别工作。这个版本不能直接应用商业化,只是提供一种方法,你可以根据自己的需求修改。另外:...
"方正教务系统验证码识别"是一个涉及到图像处理和机器学习的项目,主要目标是提高自动识别验证码的准确性和效率。...通过深入探究这个项目,我们可以学习到如何在限制条件下设计和实现有效的验证码识别系统。
对于更高级的验证码识别,可能需要使用更先进的图像处理技术,如深度学习,并且需要大量的训练数据和计算资源。 总的来说,PHP实现自动识别验证码是一项具有挑战性的任务,需要深入理解图像处理、模式识别以及机器...
在PHP中实现验证码识别是一个涉及图像处理、随机数生成以及字符串比较等技术的过程。验证码的主要目的是为了防止自动化脚本或机器人进行恶意操作,比如防止批量注册、刷票等。在这个"php识别验证码完整例子"中,我们...
本次我们关注的是“php.zip_PHP验证码识别”这个主题,它涉及到如何使用PHP编写代码来实现验证码的识别功能。验证码是一种安全机制,用于防止自动化的机器人程序进行恶意操作,如批量注册、刷票等。它通常包含随机...
故此可以轻松嵌入到网页之中,在保持浏览器会话环境的同时,还可以实现仅读取1次验证码图片(大部分验证码每次读取的结果都不一样)就可以实现验证码图片显示和识别的2重功能。借助ZiilaaBrowser浏览器插件,还解决...
基于 PHP 的验证码识别技术研究与实现 验证码技术是一种广泛应用于网站安全认证的方法,它可以有效防止机器人和恶意攻击,但同时也降低了用户体验。随着移动设备的普及,验证码技术在移动端的应用变得越来越重要。...
在Web开发中,PHP是一种广泛应用的服务器端脚本语言,因此使用PHP来实现验证码识别是一个常见的需求。本文将深入探讨验证码识别的基本原理以及如何使用PHP进行实现。 验证码通常由一串随机字符组成,这些字符可能是...