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


Posted in PHP onNovember 18, 2014

我们通过PHP的GD库图像处理内容,设计一个验证码类Vcode。将该类声明在文件vcode.class.php中,并通过面向对象的特性将一些实现的细节封装在该类中。只要在创建对象时,为构造方法提供三个参数,包括创建验证码图片的宽度、高度及验证码字母个数,就可以成功创建一个验证码类的对象。该类的声明代码如下所示:

<?php
 class Vcode {
  private $width; //宽
  private $height; //高
  private $num;  //数量
  private $code; //验证码
  private $img;  //图像的资源
 
  //构造方法, 三个参数
  function __construct($width=80, $height=20, $num=4) {
   $this->width = $width;
   $this->height = $height;
   $this->num = $num;
   $this->code = $this->createcode(); //调用自己的方法
  }
 
  //获取字符的验证码, 用于保存在服务器中
  function getcode() {
   return $this->code;
  }
 
  //输出图像
  function outimg() {
   //创建背景 (颜色, 大小, 边框)
   $this->createback();
 
   //画字 (大小, 字体颜色)
   $this->outstring();
 
   //干扰元素(点, 线条)
 
   $this->setdisturbcolor();
   //输出图像
   $this->printimg();
  }
 
  //创建背景
  private function createback() {
   //创建资源
   $this->img = imagecreatetruecolor($this->width, $this->height);
   //设置随机的背景颜色
   $bgcolor = imagecolorallocate($this->img, rand(225, 255), rand(225, 255), rand(225, 255)); 
   //设置背景填充
   imagefill($this->img, 0, 0, $bgcolor);
   //画边框
   $bordercolor = imagecolorallocate($this->img, 0, 0, 0);
 
    imagerectangle($this->img, 0, 0, $this->width-1, $this->height-1, $bordercolor);
  }
 
  //画字
  private function outstring() {
   for($i=0; $i<$this->num; $i++) {
 
    $color= imagecolorallocate($this->img, rand(0, 128), rand(0, 128), rand(0, 128)); 
 
    $fontsize=rand(3,5); //字体大小
 
    $x = 3+($this->width/$this->num)*$i; //水平位置
    $y = rand(0, imagefontheight($fontsize)-3);
 
    //画出每个字符
    imagechar($this->img, $fontsize, $x, $y, $this->code{$i}, $color);
   }
  }
 
  //设置干扰元素
  private function setdisturbcolor() {
   //加上点数
   for($i=0; $i<100; $i++) {
    $color= imagecolorallocate($this->img, rand(0, 255), rand(0, 255), rand(0, 255)); 
    imagesetpixel($this->img, rand(1, $this->width-2), rand(1, $this->height-2), $color);
   }
 
   //加线条
   for($i=0; $i<10; $i++) {
    $color= imagecolorallocate($this->img, rand(0, 255), rand(0, 128), rand(0, 255)); 
    imagearc($this->img,rand(-10, $this->width+10), rand(-10, $this->height+10), rand(30, 300), rand(30, 300), 55,44, $color);
   }
  }
 
  //输出图像
  private function printimg() {
   if (imagetypes() & IMG_GIF) {
     header("Content-type: image/gif");
     imagegif($this->img);
   } elseif (function_exists("imagejpeg")) {
     header("Content-type: image/jpeg");
     imagegif($this->img);
   } elseif (imagetypes() & IMG_PNG) {
     header("Content-type: image/png");
     imagegif($this->img);
   } else {
     die("No image support in this PHP server");
   } 
 
  }
 
  //生成验证码字符串
  private function createcode() {
   $codes = "3456789abcdefghijkmnpqrstuvwxyABCDEFGHIJKLMNPQRSTUVWXY";
 
   $code = "";
 
   for($i=0; $i < $this->num; $i++) {
    $code .=$codes{rand(0, strlen($codes)-1)}; 
   }
 
   return $code;
  }
 
  //用于自动销毁图像资源
  function __destruct() {
   imagedestroy($this->img);
  }
 
 }

在上面的脚本中,虽然声明验证码类Vcode的代码比较多,但细节都被封装在类中,只要直接输出对象,就可以向客户端浏览器中输出幅图片,并可以在浏览器表单中使用。另外本类自动获取验证码图片中的字符串,促成在服务的$_SESSION["code"]中。在提交表单时,只有用户在表单中输入验证码图片上显示的文字,并和服务器中保留的验证码字符串完全相同时,表单才可以提交成功。(注意:验证码在服务器端在$_SESSION["code"]中,所以必须开启session会话才能使用该类,)

在下面的脚本code.php中,使用session_start()开启用户会话控制,然后包含验证码类Vcode所在文件vcode.class.php,创建该类对象并直接输出。就可以将随机生成的验证码图片发送出去,同时会自动将这个验证码字符串保存在服务器中一份。代码如下所示:

<?php
 //开启session
 session_start();
 include "vcode.class.php";
 //构造方法
 $vcode = new Vcode(80, 30, 4);
 //将验证码放到服务器自己的空间保存一份
 $_SESSION['code'] = $vcode->getcode();
 //将验证码图片输出
 $vcode->outimg();
?>

 表单代码如下所示:

<?php
 session_start();
if(isset($_POST['dosubmit'])) {
 if(strtoupper($_SESSION['code']) == strtoupper($_POST['code']) ) {
  echo "输入成功!<br>";
 }else{
  echo "输入不对!<br>";
 }
}
?>
 
<body>
 <form action="reg.php" method="post">
  username: <input type="text" name="username"> <br>
  password: <input type="password" name="password"> <br>
  code: <input type="text" onkeyup="if(this.value!=this.value.toUpperCase()) this.value=this.value.toUpperCase()" size="6" name="code"> 
    <img src="code.php" onclick="this.src='code.php?'+Math.random()" /> <br>
  <input type="submit" name="dosubmit" value="登 录"> <br>
 </form>
</body>

PHP经典验证码类下载:

PHP 相关文章推荐
Ajax+PHP 边学边练之四 表单
Nov 27 PHP
php中cookie的使用方法
Mar 29 PHP
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
Jun 12 PHP
PHP实现的汉字拼音转换和公历农历转换类及使用示例
Jul 01 PHP
PHP魔术方法的使用示例
Jun 23 PHP
深入理解PHP中的Streams工具
Jul 03 PHP
thinkPHP简单调用函数与类库的方法
Mar 15 PHP
POST一个JSON格式的数据给Restful服务实例详解
Apr 07 PHP
PHP微信公众号开发之微信红包实现方法分析
Jul 14 PHP
PHP读取CSV大文件导入数据库的实例
Jul 24 PHP
LNMP部署laravel以及xhprof安装使用教程
Sep 14 PHP
PHP如何将图片文件上传到另外一台服务器上
Aug 26 PHP
一个经典实用的PHP图像处理类分享
Nov 18 #PHP
PHP中一些可以替代正则表达式函数的字符串操作函数
Nov 17 #PHP
PHP向浏览器输出内容的4个函数总结
Nov 17 #PHP
PHP中使用匿名函数操作数据库的例子
Nov 17 #PHP
PHP中定义数组常量(array常量)的方法
Nov 17 #PHP
php中addslashes函数与sql防注入
Nov 17 #PHP
php数组排序usort、uksort与sort函数用法
Nov 17 #PHP
You might like
php5.5新数组函数array_column使用
2013/07/08 PHP
为PHP5.4开启Zend OPCode缓存
2014/12/26 PHP
php引用和拷贝的区别知识点总结
2019/09/23 PHP
php swoft框架实例用法
2020/12/22 PHP
JS效率个人经验谈(8-15更新),加入range技巧
2007/01/09 Javascript
5 cool javascript apps
2007/03/24 Javascript
10款新鲜出炉的 jQuery 插件(Ajax 插件,有幻灯片、图片画廊、菜单等)
2011/06/08 Javascript
js中将HTMLCollection/NodeList/伪数组转换成数组的代码
2011/07/31 Javascript
artDialog 4.1.5 Dreamweaver代码提示/补全插件 附下载
2012/07/31 Javascript
JS简单实现元素复制示例附图
2013/11/19 Javascript
瀑布流布局代码一例
2014/04/11 Javascript
jquery+easeing实现仿flash的载入动画
2015/03/10 Javascript
基于Node.js实现nodemailer邮件发送
2016/01/26 Javascript
js简单判断flash是否加载完成的方法
2016/06/21 Javascript
ionic中列表项增加和删除的实现方法
2017/01/22 Javascript
vue.js整合vux中的上拉加载下拉刷新实例教程
2018/01/09 Javascript
Vue循环组件加validate多表单验证的实例
2018/09/18 Javascript
python发腾讯微博代码分享
2014/01/10 Python
Python聚类算法之DBSACN实例分析
2015/11/20 Python
python套接字流重定向实例汇总
2016/03/03 Python
python爬虫系列Selenium定向爬取虎扑篮球图片详解
2017/11/15 Python
python数据结构学习之实现线性表的顺序
2018/09/28 Python
python验证身份证信息实例代码
2019/05/06 Python
python 实现按对象传值
2019/12/26 Python
真正了解CSS3背景下的@font face规则
2017/05/04 HTML / CSS
CSS3哪些新特性值得称赞
2016/03/02 HTML / CSS
IRO美国官网:法国服装品牌
2018/03/06 全球购物
Crabtree & Evelyn欧盟:豪华洗浴、身体和护发
2021/03/09 全球购物
怎样让char类型的东西转换成int类型
2013/12/09 面试题
JMS中Topic和Queue有什么区别
2013/05/15 面试题
营销主管自我评价怎么写
2013/09/19 职场文书
党委书记岗位职责
2013/11/24 职场文书
生产部厂长助理职位说明书
2014/03/03 职场文书
平面设计专业求职信
2014/08/09 职场文书
奖学金个人总结
2015/03/04 职场文书
MySQL高速缓存启动方法及参数详解(query_cache_size)
2021/07/01 MySQL