一个经典的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设计模式 Interpreter(解释器模式)
Jun 26 PHP
php数组的概述及分类与声明代码演示
Feb 26 PHP
php表单请求获得数据求和示例
May 15 PHP
php保存二进制原始数据为图片的程序代码
Oct 14 PHP
Laravel中使用阿里云OSS Composer包分享
Feb 10 PHP
列举PHP的Yii 2框架的开发优势
Jul 03 PHP
ThinkPHP设置禁止百度等搜索引擎转码(简单实用)
Feb 15 PHP
Yii实现的多级联动下拉菜单
Jul 13 PHP
php把时间戳转换成多少时间之前函数的实例
Nov 16 PHP
PHP无限极分类函数的实现方法详解
Apr 15 PHP
在Laravel5中正确设置文件权限的方法
May 22 PHP
PHP与Web页面交互操作实例分析
Jun 02 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
拼音码表的生成
2006/10/09 PHP
Laravel路由设定和子路由设定实例分析
2016/03/30 PHP
php判断用户是否关注微信公众号
2016/07/22 PHP
PHP获取指定日期是星期几的实现方法
2016/11/30 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
PHP单例模式模拟Java Bean实现方法示例
2018/12/07 PHP
jQuery 删除/替换DOM元素的几种方式
2014/05/20 Javascript
javascript变量声明实例分析
2015/04/25 Javascript
JS实现随机乱撞彩色圆球特效的方法
2015/05/05 Javascript
Bootstrap CSS布局之按钮
2016/12/17 Javascript
JavaScript数据结构之二叉树的删除算法示例
2017/04/13 Javascript
js自定义弹框插件的封装
2020/08/24 Javascript
React学习笔记之列表渲染示例详解
2017/08/22 Javascript
JS动态添加的div点击跳转到另一页面实现代码
2017/09/30 Javascript
使用JQuery实现图片轮播效果的实例(推荐)
2017/10/24 jQuery
解决Mac安装thrift因bison报错的问题
2018/05/17 Javascript
详解webpack引用jquery(第三方模块)的三种办法
2019/08/21 jQuery
python实现百度关键词排名查询
2014/03/30 Python
python matplotlib画图库学习绘制常用的图
2019/03/19 Python
Django REST framework 分页的实现代码
2019/06/19 Python
Django Celery异步任务队列的实现
2019/07/24 Python
python输出决策树图形的例子
2019/08/09 Python
Python函数的返回值、匿名函数lambda、filter函数、map函数、reduce函数用法实例分析
2019/12/26 Python
Python脚本导出为exe程序的方法
2020/03/25 Python
如何基于windows实现python定时爬虫
2020/05/01 Python
使用keras实现Precise, Recall, F1-socre方式
2020/06/15 Python
基于keras中的回调函数用法说明
2020/06/17 Python
HTML5 File接口在web页面上使用文件下载
2017/02/27 HTML / CSS
Farfetch澳大利亚官网:Farfetch Australia
2020/04/26 全球购物
YII2 全局异常处理深入讲解
2021/03/24 PHP
内科护士实习自我鉴定
2013/10/17 职场文书
机电一体化自荐信
2013/12/10 职场文书
优秀民警事迹材料
2014/01/29 职场文书
《小石潭记》教学反思
2014/02/13 职场文书
预防传染病方案
2014/06/14 职场文书
2016优秀护士先进个人事迹材料
2016/02/25 职场文书