PHP - 验证码实例

生成验证码的实例

1.类文件,可保存为 captcha_class.php

 /**
  * ECSHOP 验证码图片类
  * $Author: zh_live$ 
  * $ADD_TIME:2011年3月21日,星期一$
 */
 
 
 
class captcha
 {
     /**
      * 背景图片所在目录
      *
      * @var string  $folder
      */
     var $folder     = 'data/captcha';
 
    /**
      * 图片的文件类型
      *
      * @var string  $img_type
      */
     var $img_type   = 'png';
 
    /*------------------------------------------------------ */
     //-- 存在session中的名称
     /*------------------------------------------------------ */
     var $session_word = 'captcha_word';
 
    /**
      * 背景图片以及背景颜色
      *
      * 0 => 背景图片的文件名
      * 1 => Red, 2 => Green, 3 => Blue
      * @var array   $themes
      */
     var $themes_jpg = array(
         1 => array('captcha_bg1.jpg', 255, 255, 255),
         2 => array('captcha_bg2.jpg', 0, 0, 0),
         3 => array('captcha_bg3.jpg', 0, 0, 0),
         4 => array('captcha_bg4.jpg', 255, 255, 255),
         5 => array('captcha_bg5.jpg', 255, 255, 255),
     );
 
    var $themes_gif = array(
         1 => array('captcha_bg1.gif', 255, 255, 255),
         2 => array('captcha_bg2.gif', 0, 0, 0),
         3 => array('captcha_bg3.gif', 0, 0, 0),
         4 => array('captcha_bg4.gif', 255, 255, 255),
         5 => array('captcha_bg5.gif', 255, 255, 255),
     );
 
    /**
      * 图片的宽度
      *
      * @var integer $width
      */
     var $width      = 130;
 
    /**
      * 图片的高度
      *
      * @var integer $height
      */
     var $height     = 20;
 
    /**
      * 构造函数
      *
      * @access  public
      * @param   string  $folder     背景图片所在目录
      * @param   integer $width      图片宽度
      * @param   integer $height     图片高度
      * @return  bool
      */
     function captcha($folder = '', $width = 145, $height = 20)
     {
         if (!empty($folder))
         {
             $this->folder = $folder;
         }
 
        $this->width    = $width;
         $this->height   = $height;
 
        /* 检查是否支持 GD */
         if (PHP_VERSION >= '4.3')
         {
 
            return (function_exists('imagecreatetruecolor') || function_exists('imagecreate'));
         }
         else
         {
 
            return (((imagetypes() & IMG_GIF) > 0) || ((imagetypes() & IMG_JPG)) > 0 );
         }
     }
 
    /**
      * 构造函数
      *
      * @access  public
      * @param
      *
      * @return void
      */
     function __construct($folder = '', $width = 145, $height = 20)
     {
         $this->captcha($folder, $width, $height);
     }
 

    /**
      * 检查给出的验证码是否和session中的一致
      *
      * @access  public
      * @param   string  $word   验证码
      * @return  bool
      */
     function check_word($word)
     {
         $recorded = isset($_SESSION[$this->session_word]) ? base64_decode($_SESSION[$this->session_word]) : '';
         $given    = $this->encrypts_word(strtoupper($word));
 
        return (preg_match("/$given/", $recorded));
     }
 
    /**
      * 生成图片并输出到浏览器
      *
      * @access  public
      * @param   string  $word   验证码
      * @return  mix
      */
     function generate_image($word = false)
     {
         if (!$word)
         {
             $word = $this->generate_word();
         }
 
        /* 记录验证码到session */
         $this->record_word($word);
 
        /* 验证码长度 */
         $letters = strlen($word);
 
        /* 选择一个随机的方案 */
         mt_srand((double) microtime() * 1000000);
 
        if (function_exists('imagecreatefromjpeg') && ((imagetypes() & IMG_JPG) > 0))
         {
             $theme  = $this->themes_jpg[mt_rand(1, count($this->themes_jpg))];
         }
         else
         {
             $theme  = $this->themes_gif[mt_rand(1, count($this->themes_gif))];
         }
 
        if (!file_exists($this->folder . $theme[0]))
         {
             return false;
         }
         else
         {
             $img_bg    = (function_exists('imagecreatefromjpeg') && ((imagetypes() & IMG_JPG) > 0)) ?
                             imagecreatefromjpeg($this->folder . $theme[0]) : imagecreatefromgif($this->folder . $theme[0]);
             $bg_width  = imagesx($img_bg);
             $bg_height = imagesy($img_bg);
 
            $img_org   = ((function_exists('imagecreatetruecolor')) && PHP_VERSION >= '4.3') ?
                           imagecreatetruecolor($this->width, $this->height) : imagecreate($this->width, $this->height);
 
            /* 将背景图象复制原始图象并调整大小 */
             if (function_exists('imagecopyresampled') && PHP_VERSION >= '4.3') // GD 2.x
             {
                 imagecopyresampled($img_org, $img_bg, 0, 0, 0, 0, $this->width, $this->height, $bg_width, $bg_height);
             }
             else // GD 1.x
             {
                 imagecopyresized($img_org, $img_bg, 0, 0, 0, 0, $this->width, $this->height, $bg_width, $bg_height);
             }
             imagedestroy($img_bg);
 
            $clr = imagecolorallocate($img_org, $theme[1], $theme[2], $theme[3]);
 
            /* 绘制边框 */
              imagerectangle($img_org, 0, 0, $this->width - 1, $this->height - 1, $clr);
 
            /* 获得验证码的高度和宽度 */
             $x = ($this->width - (imagefontwidth(5) * $letters)) / 2;
             $y = ($this->height - imagefontheight(5)) / 2;
             imagestring($img_org, 5, $x, $y, $word, $clr);
 -----------------添加干扰素----------------------------------------------
 $white=ImageColorAllocate($img_org,234,185,95);
 imagearc($img_org, 1, 8, 20, 10, 5, 13, $white);
  imagearc($img_org, 5, 7,14, 5, 7, 23, $white);
  //在图片上画一条线段,指定下坐标点
   imageline($img_org,135,3,10,18,$white);
  imageline($img_org,120,6,100,19,$white);
   imageline($img_org,5,3,110,18,$white);
  
    
------------------添加干扰素 END ---------------------------------------------
             header('Expires: Thu, 01 Jan 1970 00:00:00 GMT');
 
            // HTTP/1.1
             header('Cache-Control: private, no-store, no-cache, must-revalidate');
             header('Cache-Control: post-check=0, pre-check=0, max-age=0', false);
 
            // HTTP/1.0
             header('Pragma: no-cache');
             if ($this->img_type == 'jpeg' && function_exists('imagecreatefromjpeg'))
             {
                 header('Content-type: image/jpeg');
                 imageinterlace($img_org, 1);
                 imagejpeg($img_org, false, 95);
             }
             else
             {
                 header('Content-type: image/png');
                 imagepng($img_org);
             }
 
            imagedestroy($img_org);
 
            return true;
         }
     }
 
    /*------------------------------------------------------ */
     //-- PRIVATE METHODs
     /*------------------------------------------------------ */
 
    /**
      * 对需要记录的串进行加密
      *
      * @access  private
      * @param   string  $word   原始字符串
      * @return  string
      */
     function encrypts_word($word)
     {
         return substr(md5($word), 1, 10);
     }
 
    /**
      * 将验证码保存到session
      *
      * @access  private
      * @param   string  $word   原始字符串
      * @return  void
      */
     function record_word($word)
     {
         $_SESSION[$this->session_word] = base64_encode($this->encrypts_word($word));
     }
 
    /**
      * 生成随机的验证码
      *
      * @access  private
      * @param   integer $length     验证码长度
      * @return  string
      */
     function generate_word($length = 4)
     {
         $chars = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ';
 
        for ($i = 0, $count = strlen($chars); $i < $count; $i++)
         {
             $arr[$i] = $chars[$i];
         }
 
        mt_srand((double) microtime() * 1000000);
         shuffle($arr);
 
        return substr(implode('', $arr), 5, $length);
     }
 }


 

2.实例化该类,可保存为captcha.php

include('includes/captcha_class.php');
$img = new captcha('images/captcha/');
@ob_end_clean(); //清除之前出现的多余输入
$img->generate_image();


 

3.验证码实例,将该代码写入需要验证码的文件中

<img src="captcha.php" width="145" height="20" alt="CAPTCHA" border="1" οnclick= this.src="captcha.php?act="+Math.random() style="cursor: pointer;" title="看不清楚?点击再换一张!" />


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值