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


Nov 16 2015

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

首页 » 渗透测试 » php实现验证码的破解识别(初级篇)   

以下内容转载自网络。

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

验证码的作用
有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试。其实现代的验证码一般是防止机器批量注册的,防止机器批量发帖回复。目前,不少网站为了防止用户利用机器人自动注册、登录、灌水,都采用了验证码技术。
所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。

我们最常见的验证码
1,四位数字,随机的一数字字符串,最原始的验证码,验证作用几乎为零。
2,随机数字图片验证码。图片上的字符比较中规中矩,有的可能加入一些随机干扰素,还有一些是随机字符颜色,验证作用比上一个好。没有基本图形图像学知识的人,不可破!
3,各种图片格式的随机数字+随机大写英文字母+随机干扰像素+随机位置。
4,汉字是注册目前最新的验证码,随机生成,打起来更难了,影响用户体验,所以,一般应用的比较少。
简单起见,我们这次说明的主要对象是第2种类型的,我们先看几种网上比较常见的这种验证码的图片.valter.jpg

以下内容转载自网络。

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

验证码的作用
有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试。其实现代的验证码一般是防止机器批量注册的,防止机器批量发帖回复。目前,不少网站为了防止用户利用机器人自动注册、登录、灌水,都采用了验证码技术。
所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。

我们最常见的验证码
1,四位数字,随机的一数字字符串,最原始的验证码,验证作用几乎为零。
2,随机数字图片验证码。图片上的字符比较中规中矩,有的可能加入一些随机干扰素,还有一些是随机字符颜色,验证作用比上一个好。没有基本图形图像学知识的人,不可破!
3,各种图片格式的随机数字+随机大写英文字母+随机干扰像素+随机位置。
4,汉字是注册目前最新的验证码,随机生成,打起来更难了,影响用户体验,所以,一般应用的比较少。
简单起见,我们这次说明的主要对象是第2种类型的,我们先看几种网上比较常见的这种验证码的图片.

php实现验证码的破解识别(中级篇)地址:http://www.geekso.com/Valite2/

例子图片:ceshi.jpeg

 

例子代码:

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="";
    // 查找4个数字
    $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;
 
}

例子下载地址:

ceshi.rar


演示地址:http://www.geekso.com/component/yanzhengma/

 

 

 

正文部分到此结束

文章标签: 验证码识别 验证码破解

版权声明:若无特殊注明,本文皆为( mOon )原创,转载请保留文章出处。

也许喜欢: «php实现验证码的破解识别(中级篇) | 利用搜索引擎来进行漏洞批量抓取 php小脚本»

这篇文章还没有收到评论,赶紧来抢沙发吧~