一个强大的PHP验证码

转载 2012年03月29日 09:30:48
来源:网络
authcode.class.php
<?php
//验证码 类
class Vcode{

    private $width; //验证图片宽度,程序自动计算
    private $height; //验证图片高度
    private $length; //验证码长度
    private $bgColor; //验证图片背景色
    private $fontColor; //验证码颜色
    private $dotNoise; //噪点数量
    private $lineNoise; //干扰线数量
    private $im; //GD图像操作资源

    public function Vcode()
     {
        $this->dotNoise = 20; //初始化噪点数量
        $this->lineNoise = 2; //初始化干扰线数量
    }
     //设置长度
    public function setLength($length)
     {
        $this->length = $length;
    }
     //设置背景色
    public function setBgColor($bgColor)
     {
        $this->bgColor = sscanf($bgColor, '#%2x%2x%2x');
    }
     //设置前景色
    public function setFontColor($fontColor)
     {
        $this->fontColor = sscanf($fontColor, '#%2x%2x%2x');
    }
     //手动设置噪点数量后,会覆盖初始设置
    public function setDotNoise($num)
     {
        $this->dotNoise = $num;
    }
     //手动设置干扰线数量后,会覆盖初始设置
    public function setLineNoise($num)
     {
        $this->lineNoise = $num;
    }
     //生成随机字符串
    private function randString()
     {
        $string = strtoupper(md5(microtime().mt_rand(0,9)));
        return substr($string, 0, $this->length);
    }
     //根据制定的数量随机画噪点,噪点颜色也随机
    private function drawDot()
     {
        for($i=0; $i<$this->dotNoise; $i++)
          {
               $color = imagecolorallocate($this->im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255)); //生成随机颜色
            imagesetpixel($this->im, mt_rand(0, $this->width), mt_rand(0, $this->height), $color); //在随机生成的坐标上画噪点
        }
    }
     //随机颜色随机画干扰线
    private function drawLine()
     {
        for($i=0; $i<$this->lineNoise; $i++)
          {
            $color = imagecolorallocate($this->im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255)); //随机生成颜色
            imageline($this->im, mt_rand(0, $this->width), mt_rand(0, $this->height), mt_rand(0, $this->width), mt_rand(0, $this->height), $color); //在随机生成的坐标上画干扰线
        }
    }
     //设计验证码的图
    public function paint()
     {
        if(empty($this->length)) $this->length = 4; //验证码默认长度为4
        $this->width = $this->length*12+4 ; //计算验证图片宽度
        $this->height = 20; //制定验证码图片高度
        $this->im = imagecreate($this->width, $this->height); //创建画布
        if(empty($this->bgColor) || empty($this->fontColor))
          {    
               //如果没有设置前景色和背景色则全部随机
            //避免前景色和背景色过于接近,背景色(0-130)的随机范围与前景色(131-255)分开
               imagecolorallocate($this->im, mt_rand(0, 130), mt_rand(0, 130), mt_rand(0, 130));  
               $randString = $this->randString();    
               for($i=0; $i<$this->length; $i++)
               {
                    $fontColor = imagecolorallocate($this->im, mt_rand(131, 255), mt_rand(131, 255), mt_rand(131, 255));
                imagestring($this->im, 3,$i*10+8,mt_rand(0,8),
                    $randString{$i},
                    $fontColor); //单个验证码字符高度随机,避免被OCR
            } 
        }
          else
          {    
               //如果设置了背景色和前景色,则不使用随机颜色
            imagecolorallocate
               (
                    $this->im,
                    $this->bgColor[0],
                    $this->bgColor[1],
                    $this->bgColor[2]
               );
               $randString = $this->randString();
               $fontColor = imagecolorallocate
               (
                    $this->im,
                    $this->fontColor[0],
                    $this->fontColor[1],
                    $this->fontColor[2]
               );
               for($i=0;$i<$this->length;$i++)
               {
                    imagestring($this->im, 3,
                    $i*10+8,
                    mt_rand(0,8),
                    $randString{$i},
                    $fontColor);//每个验证码字符高度仍然随机
            }
           
        }
        $this->drawDot();//绘制噪点
        $this->drawLine();//绘制干扰线
        imagepng($this->im);
        imagedestroy($this->im);
        return md5($randString);//返回MD5加密后的验证码,可直接放入session 
    }
}

authcode.php
<?php
//生成验证码()
     require_once 'authcode.class.php';
     header("Content-Type:image/png");
     session_start(); 
     $vcode = new Vcode();
     $vcode->setLength(5);
     $_SESSION['vcode'] = $vcode->paint();
?>

一个漂亮的php验证码类

输出实例: 1、先把验证码类保存为一个名为 ValidateCode.class.php 的文件; ...
  • haibo0668
  • haibo0668
  • 2016年09月28日 17:01
  • 1018

一个经典的PHP验证码类分享

我们通过PHP的GD库图像处理内容,设计一个验证码类Vcode。将该类声明在文件vcode.class.php中,并通过面向对象的特性将一些实现的细节封装在该类中。只要在创建对象时,为构造方法提供三个...
  • bfboys
  • bfboys
  • 2016年10月19日 21:44
  • 370

PHP之验证码生成和使用

PHP之验证码生成和使用
  • netuser1937
  • netuser1937
  • 2017年02月04日 15:16
  • 477

[PHP] PHP生成4位数验证码

验证码功能
  • daly_SCZ
  • daly_SCZ
  • 2016年11月24日 15:10
  • 261

PHP实现四位数字+字母验证码

一、新建captcha.php,写入以下代码:
  • LYHVOYAGE
  • LYHVOYAGE
  • 2016年04月27日 16:05
  • 1630

一个漂亮的php验证码类(分享)

直接上代码: 复制代码 代码如下: //验证码类 class ValidateCode {  private $charset = 'abcdefghkmnprstuvwxyzABCDEF...
  • bfboys
  • bfboys
  • 2016年10月19日 21:43
  • 914

php验证码--字符

字符验证码的制作分五步: 1.生成图像 2.生成随机数 3.制作干扰点、线 4.输出图像 5.销毁图像 下面直接上代码 服务器端: ...
  • qq_20480611
  • qq_20480611
  • 2015年07月29日 17:04
  • 2260

Php实现验证码功能

验证码这样的功能可以说是无处不在了,接下来使用php来实现验证码这样的功能,这里我是将验证码实现抽取到一个类中独立开来,那么后面如果再使用到验证码功能,直接引入该类文件并创建该类的实例,就可以使用验证...
  • u011109042
  • u011109042
  • 2014年09月23日 16:23
  • 7109

PHP使用GD库画简单的验证码

使用PHP GD库(Graphic Device)绘制简单的页面验证码 有注释:
  • u013045971
  • u013045971
  • 2015年02月12日 01:19
  • 1822

用PHP生成验证码可以进行点击刷新

验证码的大致原理是这样的,首先生成一个随机数,然后在数据数上面加上干扰图片,同时把该数据生成图片并输出。这个数据保存在session中。然后把用户的输入与保存在session中的数据进行匹配,进行验证...
  • jallin2001
  • jallin2001
  • 2010年02月08日 11:50
  • 5265
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个强大的PHP验证码
举报原因:
原因补充:

(最多只允许输入30个字)