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 相关文章推荐
模拟OICQ的实现思路和核心程序(三)
Oct 09 PHP
Thinkphp中Create方法深入探究
Jun 16 PHP
destoon切换城市后实现logo旁边显示地区名称的方法
Aug 21 PHP
php使用pdo连接mssql server数据库实例
Dec 25 PHP
php实现遍历目录并删除指定文件中指定内容
Jan 21 PHP
PHP获取文件夹内文件数的方法
Mar 12 PHP
php使用数组填充下拉列表框的方法
Mar 31 PHP
在PHP程序中使用Rust扩展的方法
Jul 03 PHP
php实现的SSO单点登录系统接入功能示例分析
Oct 12 PHP
启用OPCache提高PHP程序性能的方法
Mar 21 PHP
详解PHP中curl_multi并发的实现
Jun 08 PHP
基于PHP实现生成随机水印图片
Dec 09 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
仿AS3实现PHP 事件机制实现代码
2011/01/27 PHP
无刷新动态加载数据 滚动条加载适合评论等页面
2013/10/16 PHP
PHP中is_dir()函数使用指南
2015/05/08 PHP
php源码之将图片转化为data/base64数据流实例详解
2016/11/27 PHP
Javascript 类与静态类的实现(续)
2010/04/02 Javascript
jquery getScript动态加载JS方法改进详解
2012/11/15 Javascript
使用js判断TextBox控件值改变然后出发事件
2014/03/07 Javascript
jQuery对val和atrr(&quot;value&quot;)赋值的区别介绍
2014/09/26 Javascript
JS中获取函数调用链所有参数的方法
2015/05/07 Javascript
JS实现超简单的仿QQ折叠菜单效果
2015/09/21 Javascript
原生js实现弹出层登录拖拽功能
2016/12/05 Javascript
浅谈js中startsWith 函数不能在任何浏览器兼容的问题
2017/03/01 Javascript
jquery+css实现下拉列表功能
2017/09/03 jQuery
基于vue.js中关于下拉框的值默认及绑定问题
2018/08/22 Javascript
vue自定义全局共用函数详解
2018/09/18 Javascript
vue使用laydate时间插件的方法
2018/11/14 Javascript
python冒泡排序算法的实现代码
2013/11/21 Python
Python中的pass语句使用方法讲解
2015/05/14 Python
Python常见字符串操作函数小结【split()、join()、strip()】
2018/02/02 Python
django删除表重建的实现方法
2019/08/28 Python
python循环嵌套的多种使用方法解析
2019/11/29 Python
Python迷宫生成和迷宫破解算法实例
2019/12/24 Python
使用python实现飞机大战游戏
2020/03/23 Python
Python求凸包及多边形面积教程
2020/04/12 Python
python中get和post有什么区别
2020/06/19 Python
python tkiner实现 一个小小的图片翻页功能的示例代码
2020/06/24 Python
Python爬虫爬取新闻资讯案例详解
2020/07/14 Python
套娃式文件夹如何通过Python批量处理
2020/08/23 Python
CSS3贝塞尔曲线示例:创建链接悬停动画效果
2020/11/19 HTML / CSS
预备党员期盼十八届四中全会召开思想汇报
2014/10/17 职场文书
本科毕业论文致谢怎么写
2015/05/14 职场文书
2015年行政管理人员工作总结
2015/10/15 职场文书
2016入党积极分子党校培训心得体会
2016/01/06 职场文书
个人售房合同协议书
2016/03/21 职场文书
Python语言中的数据类型-序列
2022/02/24 Python
Vue OpenLayer测距功能的实现
2022/04/20 Vue.js