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-accelerator网站加速PHP缓冲的方法
Jul 30 PHP
浅析php中三个等号(===)和两个等号(==)的区别
Aug 06 PHP
ThinkPHP模板引擎之导入资源文件方法详解
Jun 18 PHP
PHP实现的简单日历类
Nov 29 PHP
php如何获取文件的扩展名
Oct 28 PHP
详解配置 Apache 服务器支持 PHP 文件的解析
Feb 15 PHP
PDO::getAvailableDrivers讲解
Jan 28 PHP
PHP实现数组根据某个字段进行水平合并,横向合并案例分析
Oct 08 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
Dec 25 PHP
ThinkPHP5.1+Ajax实现的无刷新分页功能示例
Feb 10 PHP
php双向队列实例讲解
Nov 17 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
《OVERLORD》第四季,终于等到你!
2020/03/02 日漫
11个PHP 分页脚本推荐
2011/08/15 PHP
php获取mysql字段名称和其它信息的例子
2014/04/14 PHP
PHP获取数组最后一个值的2种方法
2015/01/21 PHP
PHP Reflection API详解
2015/05/12 PHP
PHP使用ODBC连接数据库的方法
2015/07/18 PHP
PHP如何通过date() 函数格式化显示时间
2020/11/13 PHP
六款帮助你实现惊艳视差滚动效果的jQuery插件
2012/09/14 Javascript
一个级联菜单代码学习及removeClass与addClass的应用
2013/01/24 Javascript
javascript实现点击商品列表checkbox实时统计金额的方法
2015/05/15 Javascript
代码分析jQuery四种静态方法使用
2015/07/23 Javascript
javascript验证手机号和实现星号(*)代替实例
2016/08/16 Javascript
vue.js开发环境安装教程
2017/03/17 Javascript
基于javascript 显式转换与隐式转换(详解)
2017/12/15 Javascript
JavaScript Canvas实现验证码
2020/08/02 Javascript
封装Vue Element的table表格组件的示例详解
2020/08/19 Javascript
python list中append()与extend()用法分享
2013/03/24 Python
从Python的源码浅要剖析Python的内存管理
2015/04/16 Python
python3实现ftp服务功能(客户端)
2017/03/24 Python
浅谈python for循环的巧妙运用(迭代、列表生成式)
2017/09/26 Python
Python基于socket实现简单的即时通讯功能示例
2018/01/16 Python
Python开发虚拟环境使用virtualenvwrapper的搭建步骤教程图解
2018/09/19 Python
关于Keras Dense层整理
2020/05/21 Python
CSS3 优势以及网页设计师如何使用CSS3技术
2009/07/29 HTML / CSS
纯CSS3实现漂亮的input输入框动画样式库(Text input love)
2018/12/29 HTML / CSS
英国顶级珠宝品牌之家:John Greed
2018/06/09 全球购物
Microsoft Advertising美国:微软搜索广告
2019/05/01 全球购物
在校硕士自我鉴定
2014/01/23 职场文书
师范教师专业大学生职业生涯规划范文
2014/03/02 职场文书
临时用工协议书范本
2014/10/29 职场文书
十佳少年事迹材料
2014/12/25 职场文书
2015年爱牙日活动总结
2015/02/05 职场文书
怒海潜将观后感
2015/06/11 职场文书
学风建设主题班会
2015/08/17 职场文书
2016年植树节红领巾广播稿
2015/12/17 职场文书
redis限流的实际应用
2021/04/24 Redis