一个经典的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 相关文章推荐
PHP 批量删除 sql语句
Jun 05 PHP
php split汉字
Jun 05 PHP
使用VisualStudio开发php的图文设置方法
Aug 21 PHP
用Php编写注册后Email激活验证的实例代码
Mar 11 PHP
领悟php接口中interface存在的意义
Jun 27 PHP
php网站被挂木马后的修复方法总结
Nov 06 PHP
浅谈PHP中其他类型转化为Bool类型
Mar 28 PHP
WordPress中的shortcode短代码功能使用详解
May 17 PHP
PHP单例模式详解及实例代码
Dec 21 PHP
解析 thinkphp 框架中的部分方法
May 07 PHP
设定php简写功能的方法
Nov 28 PHP
php在linux环境中如何使用redis详解
Dec 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
德劲1104的电路分析与改良
2021/03/01 无线电
php mssql 时间格式问题
2009/01/13 PHP
php判断变量类型常用方法
2012/04/24 PHP
php通过字符串调用函数示例
2014/03/02 PHP
php计算整个目录大小的方法
2015/06/01 PHP
php有效防止图片盗用、盗链的两种方法
2016/11/01 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
关于JS判断图片是否加载完成且获取图片宽度的方法
2013/04/09 Javascript
jQuery实现鼠标经过图片预览大图效果
2014/04/10 Javascript
jquery实现动画菜单的左右滚动、渐变及图形背景滚动等效果
2015/08/25 Javascript
jQuery针对input的class属性写了多个值情况下的选择方法
2016/06/03 Javascript
第一次动手实现bootstrap table分页效果
2016/09/22 Javascript
详解Vue中状态管理Vuex
2017/05/11 Javascript
AngularJS 的$timeout服务示例代码
2017/09/21 Javascript
JavaScript学习笔记之DOM基础操作实例小结
2019/01/09 Javascript
vue实现Input输入框模糊查询方法
2021/01/29 Javascript
[13:25]VP vs VICI (BO3)
2018/06/07 DOTA
Python黑魔法Descriptor描述符的实例解析
2016/06/02 Python
Python编程之黑板上排列组合,你舍得解开吗
2017/10/30 Python
python3+selenium实现qq邮箱登陆并发送邮件功能
2019/01/23 Python
Django集成搜索引擎Elasticserach的方法示例
2019/06/04 Python
python多线程分块读取文件
2019/08/29 Python
python中对_init_的理解及实例解析
2019/10/11 Python
Python3 Tkinkter + SQLite实现登录和注册界面
2019/11/19 Python
Python如何读写字节数据
2020/08/05 Python
Canvas环形饼图与手势控制的实现代码
2019/11/08 HTML / CSS
美国翻新电子产品商店:The Store
2019/10/08 全球购物
大专生简历的自我评价
2013/11/26 职场文书
大学生志愿者感言
2014/01/15 职场文书
大学学习个人的自我评价
2014/02/18 职场文书
《湘夫人》教学反思
2014/02/21 职场文书
三八活动策划方案
2014/08/17 职场文书
2015年企业工作总结范文
2015/04/28 职场文书
2015年社区教育工作总结
2015/05/13 职场文书
初婚未育证明样本
2015/06/18 职场文书
网吧温馨提示
2015/07/17 职场文书