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 06 PHP
据说是雅虎的一份PHP面试题附答案
Jan 07 PHP
php笔记之常用文件操作
Oct 12 PHP
php函数的常用方法及注意之处小结
Jul 10 PHP
PHP __autoload()方法真的影响性能吗?
Mar 30 PHP
php通过ksort()函数给关联数组按照键排序的方法
Mar 18 PHP
教你php如何实现验证码
Jan 20 PHP
Yii2 RESTful中api的使用及开发实例详解
Jul 06 PHP
PHP SFTP实现上传下载功能
Jul 26 PHP
浅析PHP中的闭包和匿名函数
Dec 25 PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
Mar 12 PHP
PHP如何通过带尾指针的链表实现'队列'
Oct 22 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上传文件时文件过大$_FILES为空的解决方法
2013/11/26 PHP
PHP获取指定月份第一天和最后一天的方法
2015/07/18 PHP
joomla数据库操作示例代码
2016/01/06 PHP
php读取本地json文件的实例
2018/03/07 PHP
Javascript string 扩展库代码
2010/04/09 Javascript
JQuery UI的拖拽功能实现方法小结
2012/03/14 Javascript
JavaScript采用递归算法计算阶乘实例
2015/08/04 Javascript
Javascript简单实现面向对象编程继承实例代码
2015/11/27 Javascript
javascript实现unicode与ASCII相互转换的方法
2015/12/10 Javascript
JS组件Form表单验证神器BootstrapValidator
2016/01/26 Javascript
JavaScript中数组添加值和访问值常见问题
2016/02/06 Javascript
js防阻塞加载的实现方法
2016/09/09 Javascript
jQuery.ajax实现根据不同的Content-Type做出不同的响应
2016/11/03 Javascript
JS前端笔试题分析
2016/12/19 Javascript
jQuery实现的简单排序功能示例【冒泡排序】
2017/01/13 Javascript
微信小程序 循环及嵌套循环的使用总结
2017/09/26 Javascript
Vue 拦截器对token过期处理方法
2018/01/23 Javascript
js实现动态改变radio状态的方法
2018/02/28 Javascript
JS简单获取并修改input文本框内容的方法示例
2018/04/08 Javascript
纯js封装的ajax功能函数与用法示例
2018/05/14 Javascript
浅谈vue方法内的方法使用this的问题
2018/09/15 Javascript
从0到1学习JavaScript编写贪吃蛇游戏
2020/07/28 Javascript
JavaScript 事件代理需要注意的地方
2020/09/08 Javascript
vue.js+element 默认提示中英文操作
2020/11/11 Javascript
决策树的python实现方法
2014/11/18 Python
python的time模块和datetime模块实例解析
2019/11/29 Python
python GUI库图形界面开发之PyQt5表格控件QTableView详细使用方法与实例
2020/03/01 Python
python实现逢七拍腿小游戏的思路详解
2020/05/26 Python
使用HTML和CSS3绘制基本卡通图案的示例分享
2015/11/06 HTML / CSS
JAVA软件工程师测试题
2014/07/25 面试题
大学生优秀自荐信范文
2014/02/25 职场文书
个人求职自荐信范文
2014/06/20 职场文书
预备党员学习十八届三中全会精神思想汇报
2014/09/13 职场文书
工作检讨书怎么写
2014/10/10 职场文书
2015年见习期个人工作总结
2015/05/28 职场文书
大学生军训心得体会5篇
2019/08/15 职场文书