php实现的Captcha验证码类实例


Posted in PHP onSeptember 22, 2014

本文实例讲述了php实现的Captcha验证码类,在php程序设计中有着极其广泛的应用。分享给大家供大家参考。具体方法如下:

验证码类文件如下:

<?php
/** Captcha 验证码类
* Date: 2011-02-19
* Author: fdipzone
*/

class Captcha{ //class start

 private $sname = '';

 public function __construct($sname=''){ // $sname captcha session name
 $this->sname = $sname==''? 'm_captcha' : $sname;
 }

 /** 生成验证码图片
 * @param int $length 验证码长度
 * @param Array $param ??
 * @return IMG
 */
 public function create($length=4,$param=array()){
 Header("Content-type: image/PNG");
 $authnum = $this->random($length); //生成验证码字符.
 
 $width = isset($param['width'])? $param['width'] : 13; //文字宽度
 $height = isset($param['height'])? $param['height'] : 18; //文字高度
 $pnum = isset($param['pnum'])? $param['pnum'] : 100; //干扰象素个数
 $lnum = isset($param['lnum'])? $param['lnum'] : 2; //干扰线条数

 $this->captcha_session($this->sname,$authnum);  //将随机数写入session

 $pw = $width*$length+10;
 $ph = $height+6;
  
 $im = imagecreate($pw,$ph);   //imagecreate() 新建图像,大小为 x_size 和 y_size 的空白图像。
 $black = ImageColorAllocate($im, 238,238,238); //设置背景颜色
 
 $values = array(
  mt_rand(0,$pw), mt_rand(0,$ph),
  mt_rand(0,$pw), mt_rand(0,$ph),
  mt_rand(0,$pw), mt_rand(0,$ph),
  mt_rand(0,$pw), mt_rand(0,$ph),
  mt_rand(0,$pw), mt_rand(0,$ph),
  mt_rand(0,$pw), mt_rand(0,$ph)
 );
 imagefilledpolygon($im, $values, 6, ImageColorAllocate($im, mt_rand(170,255),mt_rand(200,255),mt_rand(210,255))); //设置干扰多边形底图
 
 /* 文字 */
 for ($i = 0; $i < strlen($authnum); $i++){
  $font = ImageColorAllocate($im, mt_rand(0,50),mt_rand(0,150),mt_rand(0,200));//设置文字颜色
  $x = $i/$length * $pw + rand(1, 6); //设置随机X坐标
  $y = rand(1, $ph/3);   //设置随机Y坐标
  imagestring($im, mt_rand(4,6), $x, $y, substr($authnum,$i,1), $font); 
 }

 /* 加入干扰象素 */
 for($i=0; $i<$pnum; $i++){
  $dist = ImageColorAllocate($im, mt_rand(0,255),mt_rand(0,255),mt_rand(0,255)); //设置杂点颜色
  imagesetpixel($im, mt_rand(0,$pw) , mt_rand(0,$ph) , $dist); 
 } 

 /* 加入干扰线 */
 for($i=0; $i<$lnum; $i++){
  $dist = ImageColorAllocate($im, mt_rand(50,255),mt_rand(150,255),mt_rand(200,255)); //设置线颜色
  imageline($im,mt_rand(0,$pw),mt_rand(0,$ph),mt_rand(0,$pw),mt_rand(0,$ph),$dist);
 }

 ImagePNG($im); //以 PNG 格式将图像输出到浏览器或文件
 ImageDestroy($im); //销毁一图像
 }

 /** 检查验证码
 * @param String $captcha 验证码
 * @param int $flag 验证成功后 0:不清除session 1:清除session
 * @return boolean
 */ 
 public function check($captcha,$flag=1){
 if(empty($captcha)){
  return false;
 }else{
  if(strtoupper($captcha)==$this->captcha_session($this->sname)){ //检测验证码
  if($flag==1){
   $this->captcha_session($this->sname,'');
  }
  return true;
  }else{
  return false;
  }
 }
 }

 /* 产生随机数函数
 * @param int $length 需要随机生成的字符串?
 * @return String
 */
 private function random($length){
 $hash = '';
 $chars = 'ABCDEFGHIJKLMNPQRSTUVWXYZ23456789';
 $max = strlen($chars) - 1;
 for($i = 0; $i < $length; $i++) {
  $hash .= $chars[mt_rand(0, $max)];
 }
 return $hash;
 }

 /** 验证码session处理方法
 * @param String $name captcha session name
 * @param String $value
 * @return String
 */
 private function captcha_session($name,$value=null){
 if(isset($value)){
  if($value!==''){
  $_SESSION[$name] = $value;
  }else{
  unset($_SESSION[$name]);
  }
 }else{
  return isset($_SESSION[$name])? $_SESSION[$name] : '';
 }
 }
} // class end
?>

demo示例程序如下:

<?php 
  session_start(); 
  require_once('Captcha.class.php'); 
 
  $obj = new Captcha($sname);   # 创建Captcha类对象 
                  # $sname为保存captcha的session name,可留空,留空?t为'm_captcha' 
 
  $obj->create($length,$param);  #创建Captcha并输出图片 
                  # $length为Captcha长度,可留空,默认为4 
                  /* $param = array( 
                      'width' => 13    captcha 字符宽度 
                      'height' => 18    captcha 字符高度 
                      'pnum' => 100    干扰点个数
                      'lnum' => 2     干扰线条数 
                      ) 
                      可留空 
                  */ 
  $obj->check($captcha,$flag); # 检查用户输入的验证码是否正确,true or false 
                  # $captcha为用户输入的验证码,必填 
                  # $flag 可留空,默认为1  
                  #    1:当验证成功后自动清除captcha session 
                  #    0:挡验证成功后不清除captcha session,用于ajax检查 
?>

相信本文所述对大家php程序设计的学习有一定的借鉴价值。

PHP 相关文章推荐
php代码把全角数字转为半角数字
Dec 10 PHP
php快速url重写 更新版[需php 5.30以上]
Apr 20 PHP
PHP中Date()时间日期函数的使用方法小结
Apr 20 PHP
深入PHP内存相关的功能特性详解
Jun 08 PHP
php加密解密函数authcode的用法详细解析
Oct 28 PHP
php从完整文件路径中分离文件目录和文件名的方法
Mar 13 PHP
php简单获取文件扩展名的方法
Mar 24 PHP
百度工程师讲PHP函数的实现原理及性能分析(一)
May 13 PHP
php微信公众平台开发之微信群发信息
Sep 13 PHP
php性能分析之php-fpm慢执行日志slow log用法浅析
Oct 17 PHP
php将服务端的文件读出来显示在web页面实例
Oct 31 PHP
PHP 使用二进制保存用户状态的实例
Jan 29 PHP
php中unserialize返回false的解决方法
Sep 22 #PHP
php实现根据字符串生成对应数组的方法
Sep 22 #PHP
PHP中auto_prepend_file与auto_append_file用法实例分析
Sep 22 #PHP
php中Y2K38的漏洞解决方法实例分析
Sep 22 #PHP
php中strstr、strrchr、substr、stristr四个函数的区别总结
Sep 22 #PHP
PHP中常用的输出函数总结
Sep 22 #PHP
C#静态方法与非静态方法实例分析
Sep 22 #PHP
You might like
基于php split()函数的用法详解
2013/06/05 PHP
PHP 网站修改默认访问文件的nginx配置
2017/05/27 PHP
PHP实现上传图片到数据库并显示输出的方法
2018/05/31 PHP
静态的动态续篇之来点XML
2006/08/15 Javascript
自己的js工具 Cookie 封装
2009/08/21 Javascript
ASP.NET jQuery 实例9  通过控件hyperlink实现返回顶部效果
2012/02/03 Javascript
js confirm()方法的使用方法实例
2013/07/13 Javascript
jquery中加载图片自适应大小主要实现代码
2013/08/23 Javascript
JS实现两表格里数据来回转移的方法
2015/05/28 Javascript
javascript实现10个球随机运动、碰撞实例详解
2015/07/08 Javascript
js实现向右横向滑出的二级菜单效果
2015/08/27 Javascript
Bootstrap表单Form全面解析
2016/06/13 Javascript
JS实现的多张图片轮流播放幻灯片效果
2016/07/22 Javascript
CSS3 media queries结合jQuery实现响应式导航
2016/09/30 Javascript
ajax实现动态下拉框示例
2017/01/10 Javascript
vuejs指令详解
2017/02/07 Javascript
vue.js从安装到搭建过程详解
2017/03/17 Javascript
Vue.js上下滚动加载组件的实例代码
2017/07/17 Javascript
微信小程序 如何引入外部字体库iconfont的图标
2018/01/31 Javascript
对VUE中的对象添加属性
2018/09/18 Javascript
node实现简单的增删改查接口实例代码
2019/08/22 Javascript
谈谈我在vue-cli3中用预渲染遇到的坑
2020/04/22 Javascript
jQuery插件simplePagination的使用方法示例
2020/04/28 jQuery
js验证账户名是否重复
2020/05/26 Javascript
在vue中created、mounted等方法使用小结
2020/07/21 Javascript
[48:53]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第一场
2014/05/26 DOTA
[40:48]DOTA2上海特级锦标赛D组败者赛 Liquid VS COL第二局
2016/02/28 DOTA
Python中的字符串替换操作示例
2016/06/27 Python
Python+OpenCV感兴趣区域ROI提取方法
2019/01/10 Python
使用Python操作ArangoDB的方法步骤
2020/02/02 Python
css3的动画特效之动画序列(animation)
2017/12/22 HTML / CSS
请编程遍历页面上所有 TextBox 控件并给它赋值为 string.Empty
2015/12/03 面试题
会计电算化专业应届大学生求职信
2013/10/22 职场文书
商场拾金不昧表扬信
2014/01/13 职场文书
工程建设实施方案
2014/03/14 职场文书
Tomcat安装使用及部署Web项目的3种方法汇总
2022/08/14 Servers