一个经典的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获取远程图片的两种 CURL方式和sockets方式获取远程图片
Nov 07 PHP
浅析php面向对象public private protected 访问修饰符
Jun 30 PHP
解密ThinkPHP3.1.2版本之模块和操作映射
Jun 19 PHP
php中获取主机名、协议及IP地址的方法
Nov 18 PHP
php读取flash文件高宽帧数背景颜色的方法
Jan 06 PHP
php的4种常见运行方式
Mar 20 PHP
PHP中你应该知道的require()文件包含的正确用法
Jun 12 PHP
windows下apache搭建php开发环境
Aug 27 PHP
Yii框架实现多数据库配置和操作的方法
May 25 PHP
php基于session锁防止阻塞请求的方法分析
Aug 07 PHP
PHP的mysqli_set_charset()函数讲解
Jan 23 PHP
如何在Laravel5.8中正确地应用Repository设计模式
Nov 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
php 随机生成10位字符代码
2009/03/26 PHP
微信API接口大全
2015/04/15 PHP
PHP利用超级全局变量$_POST来接收表单数据的实例
2016/11/05 PHP
PHP中仿制 ecshop验证码实例
2017/01/06 PHP
PHP框架Laravel中实现supervisor执行异步进程的方法
2017/06/07 PHP
php变量与字符串的增删改查操作示例
2020/05/07 PHP
JQuery学习笔记 nt-child的使用
2011/01/17 Javascript
JS获取整个页面文档的实现代码
2011/12/15 Javascript
仿新浪微博登陆邮箱提示效果的js代码
2013/08/02 Javascript
实现placeholder效果的方案汇总
2015/06/11 Javascript
jfinal与bootstrap的登录跳转实战演习
2015/09/22 Javascript
jQuery插件passwordStrength密码强度指标详解
2016/06/24 Javascript
JS HTML5拖拽上传图片预览
2016/07/18 Javascript
nodejs进阶(6)—连接MySQL数据库示例
2017/01/07 NodeJs
javascript中的面向对象
2017/03/30 Javascript
详解vue.js移动端导航navigationbar的封装
2017/07/05 Javascript
无限循环轮播图之运动框架(原生JS实现)
2017/10/01 Javascript
微信小程序实现红包雨功能
2018/07/11 Javascript
Vue面试题及Vue知识点整理
2018/10/07 Javascript
微信小程序时间戳转日期的详解
2019/04/30 Javascript
详解vue 自定义组件使用v-model 及探究其中原理
2019/10/11 Javascript
小程序分享链接onShareAppMessage的具体用法
2020/05/22 Javascript
在Mac OS上搭建Python的开发环境
2015/12/24 Python
Python的Asyncore异步Socket模块及实现端口转发的例子
2016/06/14 Python
Python正则表达式如何进行字符串替换实例
2016/12/28 Python
python素数筛选法浅析
2018/03/19 Python
python中for用来遍历range函数的方法
2018/06/08 Python
python的pstuil模块使用方法总结
2019/07/26 Python
浅析Python __name__ 是什么
2020/07/07 Python
聊聊python中的循环遍历
2020/09/07 Python
详解如何用canvas画一个微笑的表情
2019/03/14 HTML / CSS
写给女朋友的道歉信
2014/01/12 职场文书
银行柜员与客户起冲突检讨书
2014/09/27 职场文书
2014年幼儿园个人工作总结
2014/11/10 职场文书
2014年个人工作总结报告
2014/11/27 职场文书
2015年节能减排工作总结
2015/05/14 职场文书