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 编写的日历
Oct 09 PHP
php adodb连接不同数据库
Mar 19 PHP
判断是否为指定长度内字符串的php函数
Feb 16 PHP
memcached 和 mysql 主从环境下php开发代码详解
May 16 PHP
关于PHP实现异步操作的研究
Feb 03 PHP
PHP中echo,print_r与var_dump区别分析
Sep 29 PHP
PHP实现获取FLV文件的时间
Feb 10 PHP
php获取本周开始日期和结束日期的方法
Mar 09 PHP
PHP实现的蚂蚁爬杆路径算法代码
Dec 03 PHP
php使用curl并发减少后端访问时间的方法分析
May 12 PHP
PHP封装的MSSql操作类完整实例
May 26 PHP
PHP 二维array转换json的实例讲解
Aug 21 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之第三天
2006/10/09 PHP
比较好用的PHP防注入漏洞过滤函数代码
2012/04/11 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
PHP使Laravel为JSON REST API返回自定义错误的问题
2018/10/16 PHP
PHP __call()方法实现委托示例
2019/05/20 PHP
推荐20家国外的脚本下载网站
2011/04/28 Javascript
JS获取键盘上任意按键的值(实例代码)
2013/11/12 Javascript
原生javascript实现图片弹窗交互效果
2015/01/12 Javascript
讲解JavaScript中for...in语句的使用方法
2015/06/03 Javascript
利用JavaScript判断浏览器类型及版本
2016/08/23 Javascript
总结JavaScript的正则与其他语言的不同之处
2016/08/25 Javascript
Bootstrap CSS组件之按钮下拉菜单
2016/12/17 Javascript
Vue表单验证插件的制作过程
2017/04/01 Javascript
在vue中,v-for的索引index在html中的使用方法
2018/03/06 Javascript
node实现分片下载的示例代码
2018/10/17 Javascript
vue-cli3.0 脚手架搭建项目的过程详解
2018/10/19 Javascript
vue基础之data存储数据及v-for循环用法示例
2019/03/08 Javascript
element-ui中dialog弹窗关闭按钮失效的解决
2020/09/22 Javascript
小结Python用fork来创建子进程注意事项
2014/07/03 Python
用Python制作在地图上模拟瘟疫扩散的Gif图
2015/03/31 Python
Python实现批量压缩图片
2018/01/25 Python
Python拼接字符串的7种方法总结
2018/11/01 Python
使用Python计算玩彩票赢钱概率
2019/06/26 Python
Python随机函数库random的使用方法详解
2019/08/21 Python
python3实现在二叉树中找出和为某一值的所有路径(推荐)
2019/12/26 Python
Python openpyxl模块原理及用法解析
2020/01/19 Python
python解包用法详解
2021/02/17 Python
python爬虫爬取某网站视频的示例代码
2021/02/20 Python
CSS3旋转——彩色扇子兼容firefox浏览器
2013/06/04 HTML / CSS
Cole Haan官方网站:美国时尚潮流品牌
2017/12/06 全球购物
乡下人家教学反思
2014/02/01 职场文书
电气自动化个人求职信范文
2014/02/03 职场文书
书法大赛策划方案
2014/06/04 职场文书
2015建军节87周年演讲稿
2015/03/19 职场文书
关于redisson缓存序列化几枚大坑说明
2021/08/04 Redis
在ubuntu下安装go开发环境的全过程
2022/08/05 Golang