一个经典的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 相关文章推荐
YII实现分页的方法
Jul 09 PHP
ThinkPHP上使用多说评论插件的方法
Oct 31 PHP
php计算一个文件大小的方法
Mar 30 PHP
CodeIgniter与PHP5.6的兼容问题
Jul 16 PHP
php简单实现批量上传图片的方法
May 09 PHP
smarty的section嵌套循环用法示例
May 28 PHP
SAE实时日志接口SDK用法示例
Oct 09 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
Sep 17 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
May 23 PHP
Laravel框架分页实现方法分析
Jun 12 PHP
php多进程模拟并发事务产生的问题小结
Dec 07 PHP
使用 PHP Masked Package 屏蔽敏感数据的实现方法
Oct 15 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
PHP与已存在的Java应用程序集成
2006/10/09 PHP
jQuery 选择器理解
2010/03/16 Javascript
JavaScript编程中的Promise使用大全
2015/07/28 Javascript
node.js入门实例helloworld详解
2015/12/23 Javascript
javascript实现的猜数小游戏完整实例代码
2016/05/10 Javascript
js实现点击图片自动提交action的简单方法
2016/10/16 Javascript
AngularJS的ng Http Request与response格式转换方法
2016/11/07 Javascript
vue.js 1.x与2.0中js实时监听input值的变化
2017/03/15 Javascript
ES6(ECMAScript 6)新特性之模板字符串用法分析
2017/04/01 Javascript
微信小程序 本地数据存储实例详解
2017/04/13 Javascript
JS实现图片点击后出现模态框效果
2017/05/03 Javascript
jquery easyui如何实现格式化列
2017/07/30 jQuery
Vue Transition实现类原生组件跳转过渡动画的示例
2017/08/19 Javascript
详解A标签中href=&quot;&quot;的几种用法
2017/08/20 Javascript
Vue组件之单向数据流的解决方法
2018/11/10 Javascript
Vue 框架之键盘事件、健值修饰符、双向数据绑定
2018/11/14 Javascript
微信小程序 wx:for遍历循环使用实例解析
2019/09/09 Javascript
python使用paramiko模块实现ssh远程登陆上传文件并执行
2014/01/27 Python
《Python之禅》中对于Python编程过程中的一些建议
2015/04/03 Python
python中黄金分割法实现方法
2015/05/06 Python
matplotlib subplots 设置总图的标题方法
2018/05/25 Python
python3读取csv和xlsx文件的实例
2018/06/22 Python
python 使用 requests 模块发送http请求 的方法
2018/12/09 Python
Keras: model实现固定部分layer,训练部分layer操作
2020/06/28 Python
Python logging日志模块 配置文件方式
2020/07/12 Python
Python读取多列数据以及用matplotlib制作图表方法实例
2020/09/23 Python
python单例模式的应用场景实例讲解
2021/02/24 Python
澳大利亚天然护肤品、化妆品和健康产品一站式商店:Nourished Life
2018/12/02 全球购物
高中毕业生生活的自我评价
2013/12/08 职场文书
小学三年级数学教学反思
2014/01/31 职场文书
2014学习优秀共产党员先进事迹材料思想汇报
2014/09/14 职场文书
对照检查剖析材料
2014/09/30 职场文书
二手房购房协议书范本
2014/10/05 职场文书
新教师个人工作总结
2015/02/06 职场文书
2015年教师自我评价范文
2015/03/04 职场文书
警告通知
2015/04/25 职场文书