PHP 用session与gd库实现简单验证码生成与验证的类方法


Posted in PHP onNovember 15, 2016

验证码是为了防止机器灌水给网站带来污染以及增加服务器负担而出现的。目前大大小小的网站都有验证码。今天自己实现了一个简单的验证码类。说简单是因为没有加一些干扰的弧线等等,只是将文字旋转了一下。当然,因为字体的原因,要想一眼看出来并不容易。同时,为了避免字母的大小写与数字混淆,又去掉了那些看起来很像的字母数字。
类:

<?php
/**
 *简单生成验证码类
 */
class Captcha {
  private $width;//验证码宽度
  private $height;//验证码高度
  private $countOfChars;//字符数
  //private $distrubLines;//干扰线条数
  private $chars;//随机生成的字符串

  public function __construct($width=100,$height=30,$countOfChars=4,$distrubLines=2) {
  //初始化参数
  $this->width=$width;
  $this->height=$height;
  $this->countOfChars=$countOfChars;
  session_start();
  }

  /**
   * 执行全部动作,生成验证码并直接输出
   */
  public function execute(){
  $imageHandle=$this->createImage();
  $this->createChars();
  $this->drawChars($imageHandle);
  $this->outImage($imageHandle);
  }

  /**
   * 创建画布,并随机填充颜色
   * @return 返回画布句柄
   */
  public function createImage(){
  $imageHandle= imagecreate($this->width, $this->height);
  //随机背景颜色
    $randColor=imagecolorallocate($imageHandle, 50, mt_rand(0, 50), mt_rand(0, 50));
  imagefill($imageHandle, 0, 0, $randColor);
  return $imageHandle;
  }

  /**
   * 生成随机字符
   */
  private function createChars(){
  //候选字符
  $str='ABCDEFGHJKLMNPQRSTUVWXZabcdefghijkmnpqtuvwx2346789';
  $chars='';
  for($i=0;$i<$this->countOfChars;$i++){
    $chars.=$str[mt_rand(0,strlen($str)-1)];
  }
  $this->chars=$chars;
  //保存在会话中
  $_SESSION['captcha']=strtolower($chars);
  }

  /**
   * 将字符写入图像
   * @param type $imageHandle 图像句柄
   */
  private function drawChars($imageHandle){
  if($this->chars!=null){
    $font='/home/WWW/YuWeiLiShuFT.ttf';
    for($i=0;$i<strlen($this->chars);$i++){
    $color= imagecolorallocate($imageHandle,mt_rand(50, 200),mt_rand(100, 255),255);
    imagefttext($imageHandle,30, 30,$i*20+10,25,$color,$font,$this->chars[$i]);
    }
  }
  }

  /**
   * 输出图像
   * @param type $imageHandle 图像句柄
   */
  private function outImage($imageHandle){
  imagepng($imageHandle);
  imagedestroy($imageHandle);
  }

  /**
   * 判断用户输入的验证码是否正确
   * @param type $usrInput 用户的输入
   * @return boolean 验证码是否匹配
   */
  public static function isRight($usrInput){
  if(isset($_SESSION['captcha'])){
    if(strtolower($usrInput)==$_SESSION['captcha']){
    $_SESSION['captcha']=null;
    return true;
    }else{
    $_SESSION['captcha']=null;
    return false;
    }
  }
  }
}

把验证设置成了静态方法,因为生成验证码后已经把验证码存到了session中,验证时直接调用静态方法,而不需要实例化这个类了。

上面的字体可以随意设置。

下面的代码讲返回一个图像,实例化Captcha类后动态生成的一个图像。(outCaptcha.php)

<?php

require('Captcha.php');
$code= new Captcha();
header('Content-Type:image/png');
$code->execute();

header(‘Content-Type:image/png');

这句话的作用是告诉浏览器输出的是png图像,而不是html代码。浏览器收到后就将下面的输出解析成图像。

然后写一个html静态页面(testCaptcha.html),创建表单

<!DOCTYPE html>
<html>
  <head>
    <title>验证码测试</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
  </head>
  <body>
    <h1>请输入验证码:</h1>
    <img src="outCaptcha.php"/>
    <form method="POST" action="prove.php">
      <input type="text" name="input_captcha"/>
      <button name="submit">确定</button>
    </form>
  </body>
</html>

仅仅是这样是不够的,看到表单提交的地址了么?那个就是用来验证验证码是否输入正确的代码:

session_start();
$inputCaptcha= trim($_POST['input_captcha']);
require('Captcha.php');
if(Captcha::isRight($inputCaptcha)){
  echo '验证码正确';
}else{
  echo '验证码错误或已过期';
}
session_destroy();

这里还是要导入Captcha这个类,然后调用其静态方法来验证你的输入。最后销毁整个会话。

最后看看效果吧

PHP 用session与gd库实现简单验证码生成与验证的类方法

太好了,成功了。那再故意输错试试,后退一下,然后刷新(如果不刷新浏览器将直接调用缓存中的验证码图片,这个时候我们的验证码还没有生成呢!所以无论怎么样都出错)。

PHP 用session与gd库实现简单验证码生成与验证的类方法

当然,真正的验证码是可以单击换一张的,这利用了ajax技术。

以上这篇PHP 用session与gd库实现简单验证码生成与验证的类方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php中通过smtp发邮件的类,测试通过
Jan 22 PHP
php中var_export与var_dump的区别分析
Aug 21 PHP
服务器web工具 php环境下
Dec 29 PHP
php伪静态之APACHE篇
Jun 02 PHP
windows7下安装php的php-ssh2扩展教程
Jul 04 PHP
Apache服务器下防止图片盗链的办法
Jul 06 PHP
PHP实现图片上传并压缩
Dec 22 PHP
PHP Yaf框架的简单安装使用教程(推荐)
Jun 08 PHP
thinkPHP分组后模板无法加载问题解决方法
Jul 12 PHP
PHP实现导出excel数据的类库用法示例
Oct 15 PHP
php抛出异常与捕捉特定类型的异常详解
Oct 26 PHP
PHP解决高并发的优化方案实例
Dec 10 PHP
PHP递归遍历指定文件夹内的文件实现方法
Nov 15 #PHP
php 判断过去离现在几年的函数(实例代码)
Nov 15 #PHP
PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)
Nov 15 #PHP
php读取qqwry.dat ip地址定位文件的类实例代码
Nov 15 #PHP
thinkPHP内置字符串截取函数用法详解
Nov 15 #PHP
ThinkPHP简单使用memcache缓存的方法
Nov 15 #PHP
php compact 通过变量创建数组
Nov 15 #PHP
You might like
PHP学习笔记(二):变量详解
2015/04/17 PHP
PHP实现原比例生成缩略图的方法
2016/02/03 PHP
Laravel实现autoload方法详解
2017/05/07 PHP
创建无限极分类树型结构的简单方法
2017/06/20 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
JavaScript 仿关机效果的图片层
2008/12/26 Javascript
JavaScript 封装Ajax传递的数据代码
2009/06/05 Javascript
img标签中onerror用法
2009/08/13 Javascript
js中的replace方法使用介绍
2013/10/28 Javascript
jQuery 计算iframe 窗口大小的方法
2014/05/13 Javascript
JavaScript通过事件代理高亮显示表格行的方法
2015/05/27 Javascript
Angularjs全局变量被作用域监听的正确姿势
2016/02/06 Javascript
JavaScript数据推送Comet技术详解
2016/04/07 Javascript
js实现各种复制到剪贴板的方法(分享)
2016/10/27 Javascript
基于JQuery和原生JavaScript实现网页定位导航特效
2017/04/03 jQuery
JS实现合并json对象的方法
2017/10/10 Javascript
JS实现的合并多个数组去重算法示例
2018/04/11 Javascript
nodejs读取并去重excel文件
2018/04/22 NodeJs
详解Vue中使用Axios拦截器
2019/04/22 Javascript
微信小程序云开发之模拟后台增删改查
2019/05/16 Javascript
ES6字符串的扩展实例
2020/12/21 Javascript
python 字符串格式化代码
2013/03/17 Python
python里使用正则表达式的组嵌套实例详解
2017/10/24 Python
python下载文件记录黑名单的实现代码
2017/10/24 Python
Python全局变量与局部变量区别及用法分析
2018/09/03 Python
python在新的图片窗口显示图片(图像)的方法
2019/07/11 Python
python使用itchat模块给心爱的人每天发天气预报
2019/11/25 Python
python 子类调用父类的构造函数实例
2020/03/12 Python
基于Keras的格式化输出Loss实现方式
2020/06/17 Python
Python中正则表达式对单个字符,多个字符和匹配边界等使用
2021/01/27 Python
探讨HTML5移动开发的几大特性(必看)
2015/12/30 HTML / CSS
关于webview适配H5上传照片或者视频文件的方法
2020/11/04 HTML / CSS
美国在线购买和出售礼品卡网站:EJ Gift Cards
2019/06/09 全球购物
应届电子商务毕业自荐书范文
2014/02/11 职场文书
开业庆典策划方案
2014/02/18 职场文书
windows server 2016 域环境搭建的方法步骤(图文)
2022/06/25 Servers