`
阿尔萨斯
  • 浏览: 4147819 次
社区版块
存档分类
最新评论

php实现验证码的识别

 
阅读更多

近期研究一些突破验证码方面的知识,记录下来。一方面算是对这几天学习知识的总结帮助自己理解;另一方面希望对研究这方面的技术同学有所帮助;另外 也希望引起网站管理者的注意,在提供验证码时多些考虑进去。由于刚刚接触这方面的知识,理解比较浅显,有错误再所难免,欢迎拍砖。
验证码的作用: 有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试。其实现代的验证码一般是防止机器批量注册的,防止机器批量发帖回复。目前,不少网站为了防止用户利用机器人自动注册、登录、灌水,都采用了验证码技术。
所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止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代码

  1. <?php
  2. define('WORD_WIDTH',9);
  3. define('WORD_HIGHT',13);
  4. define('OFFSET_X',7);
  5. define('OFFSET_Y',3);
  6. define('WORD_SPACING',4);
  7. classvalite
  8. {
  9. publicfunctionsetImage($Image)
  10. {
  11. $this->ImagePath=$Image;
  12. }
  13. publicfunctiongetData()
  14. {
  15. return$data;
  16. }
  17. publicfunctiongetResult()
  18. {
  19. return$DataArray;
  20. }
  21. publicfunctiongetHec()
  22. {
  23. $res=imagecreatefromjpeg($this->ImagePath);
  24. $size=getimagesize($this->ImagePath);
  25. $data=array();
  26. for($i=0;$i<$size[1];++$i)
  27. {
  28. for($j=0;$j<$size[0];++$j)
  29. {
  30. $rgb=imagecolorat($res,$j,$i);
  31. $rgbarray=imagecolorsforindex($res,$rgb);
  32. if($rgbarray['red']<125||$rgbarray['green']<125
  33. ||$rgbarray['blue']<125)
  34. {
  35. $data[$i][$j]=1;
  36. }else{
  37. $data[$i][$j]=0;
  38. }
  39. }
  40. }
  41. $this->DataArray=$data;
  42. $this->ImageSize=$size;
  43. }
  44. publicfunctionrun()
  45. {
  46. $result="";
  47. //查找4个数字
  48. $data=array("","","","");
  49. for($i=0;$i<4;++$i)
  50. {
  51. $x=($i*(WORD_WIDTH+WORD_SPACING))+OFFSET_X;
  52. $y=OFFSET_Y;
  53. for($h=$y;$h<(OFFSET_Y+WORD_HIGHT);++$h)
  54. {
  55. for($w=$x;$w<($x+WORD_WIDTH);++$w)
  56. {
  57. $data[$i].=$this->DataArray[$h][$w];
  58. }
  59. }
  60. }
  61. //进行关键字匹配
  62. foreach($dataas$numKey=>$numString)
  63. {
  64. $max=0.0;
  65. $num=0;
  66. foreach($this->Keysas$key=>$value)
  67. {
  68. $percent=0.0;
  69. similar_text($value,$numString,$percent);
  70. if(intval($percent)>$max)
  71. {
  72. $max=$percent;
  73. $num=$key;
  74. if(intval($percent)>95)
  75. break;
  76. }
  77. }
  78. $result.=$num;
  79. }
  80. $this->data=$result;
  81. //查找最佳匹配数字
  82. return$result;
  83. }
  84. publicfunctionDraw()
  85. {
  86. for($i=0;$i<$this->ImageSize[1];++$i)
  87. {
  88. for($j=0;$j<$this->ImageSize[0];++$j)
  89. {
  90. echo$this->DataArray[$i][$j];
  91. }
  92. echo"/n";
  93. }
  94. }
  95. publicfunction__construct()
  96. {
  97. $this->Keys=array(
  98. '0'=>'000111000011111110011000110110000011110000011110000011110000011110000011110000011110000011011000110011111110000111000',
  99. '1'=>'000111000011111000011111000000011000000011000000011000000011000000011000000011000000011000000011000011111111011111111',
  100. '2'=>'011111000111111100100000110000000111000000110000001100000011000000110000001100000011000000110000000011111110111111110',
  101. '3'=>'011111000111111110100000110000000110000001100011111000011111100000001110000000111000000110100001110111111100011111000',
  102. '4'=>'000001100000011100000011100000111100001101100001101100011001100011001100111111111111111111000001100000001100000001100',
  103. '5'=>
  104. '111111110111111110110000000110000000110000000111110000111111100000001110000000111000000110100001110111111100011111000',
  105. '6'=>'000111100001111110011000010011000000110000000110111100111111110111000111110000011110000011011000111011111110000111100',
  106. '7'=>'011111111011111111000000011000000010000000110000001100000001000000011000000010000000110000000110000001100000001100000',
  107. '8'=>'001111100011111110011000110011000110011101110001111100001111100011101110110000011110000011111000111011111110001111100',
  108. '9'=>'001111000011111110111000111110000011110000011111000111011111111001111011000000011000000110010000110011111100001111000',
  109. );
  110. }
  111. protected$ImagePath;
  112. protected$DataArray;
  113. protected$ImageSize;
  114. protected$data;
  115. protected$Keys;
  116. protected$NumStringArray;
  117. }
  118. ?>


我做了一个例子,你可以从这里下载 下载
破解完成上面的验证码,我们就可以使用snoopy(比curl要轻量,所以我喜欢)来模拟浏览器器,访问网站了。

分享到:
评论

相关推荐

    PHP实现验证码自动识别(中级篇)

    PHP实现验证码自动识别(中级篇)PHP实现验证码自动识别(中级篇)

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

    可以识别旋转字符,并且具有一定的学习功能,并提供了bmp到jpeg的转换方法,目前这个方案应该可以应付90%的互联网验证码识别工作。这个版本不能直接应用商业化,只是提供一种方法,你可以根据自己的需求修改。另外:...

    PHP实现验证码自动识别

    PHP实现验证码自动识别,测试已通过,此为测试案例!此为测试案例!

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

    近期研究一些突破验证码方面的知识,记录下来。一方面算是对这几天学习知识的总结帮助自己理解;另一方面希望对研究这方面的技术同学有所帮助;另外也希望引起网站管理者的注意,在提供验证码时多些考虑进去。由于...

    php实现验证码的识别(修正版)

    这个php实现验证码中级篇,增加二值化去杂点的操作,解决两个字符粘连问题,可以识别旋转字符,并且具有一定的学习功能,并提供了bmp到jpeg的转换方法,目前这个方案应该可以应付90%的互联网验证码识别工作。...

    php图形验证码识别keys 包含字母

    php图形验证码识别keys,程序是网上有

    验证码高级识别源码-PHP

    PHP版本验证码高级识别源码

    验证码识别-智能识别验证码.

    验证码识别 智能识别验证码 c# vb.net php

    ZiiLaa验证码自动识别程序 v1.0 PHP.rar

    故此可以轻松嵌入到网页之中,在保持浏览器会话环境的同时,还可以实现仅读取1次验证码图片(大部分验证码每次读取的结果都不一样)就可以实现验证码图片显示和识别的2重功能。借助ZiilaaBrowser浏览器插件,还解决...

    PHP识别验证码类+实例演示

    php实现验证码的识别 &lt;?php include ('Valite.php'); $valite = new Valite(); $valite-&gt;setImage('4.jpeg'); $valite-&gt;getHec(); $ert = $valite-&gt;run(); print_r($ert); ?&gt;

    优优云验证码识别答题平台DelphiDemo

    优优云验证码识别答题平台官网:http://www.uudama.com/ 相关函数说明:http://www.uudama.com/process.html 源码下载页面:http://dll.uuwise.com/index.php?n=ApiDoc.Delphi dephi完整演示程序,包括代码,演示...

    PHP自动识别验证码

    网上达人写的代码,用php来识别图片上的验证码。包里面有初级和中级,以及提交篇的源码。这个对字体变形的验证码没有办法,对常见的加干扰和文字粘连效果不错。

    php实现自动识别验证码

    php技术 自动识别验证码 现只支持简单的256色的图片识别。

    验证码普通识别源码-PHP

    验证码的普通识别代码

    256色BMP图片验证码识别脚本[php]

    供256色BMP图片验证码识别脚本代码片段,可以是大家了解到:BMP的文件结构,存储方式和对于简单的图像验证码如何进行识别处理。 您可以通过本代码片段,了解到: 1.BMP的文件结构,存储方式。 2.对于简单的图像...

    ZiiLaa验证码自动识别系统

    故此可以轻松嵌入到网页之中,在保持浏览器会话环境的同时,还可以实现仅读取1次验证码图片(大部分验证码每次读取的结果都不一样)就可以实现验证码图片显示和识别的2重功能。借助ZiilaaBrowser浏览器插件,还解决...

    基于PHP的验证码识别技术研究与实现.pdf

    基于PHP的验证码识别技术研究与实现.pdf

Global site tag (gtag.js) - Google Analytics