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 相关文章推荐
如何过滤高亮显示非法字符
Oct 09 PHP
利用PHP制作简单的内容采集器的代码
Nov 28 PHP
PHP伪静态写法附代码
Jun 20 PHP
利用PHP+JS实现搜索自动提示(实例)
Jun 09 PHP
PHP检测移动设备类mobile detection使用实例
Apr 14 PHP
3款值得推荐的微信开发开源框架
Oct 28 PHP
PHP调试的强悍利器之PHPDBG
Feb 22 PHP
Yii2验证器(Validator)用法分析
Jul 23 PHP
关于ThinkPHP中的异常处理详解
May 11 PHP
浅谈PHP SHA1withRSA加密生成签名及验签
Mar 18 PHP
PHP生成随机字符串实例代码(字母+数字)
Sep 11 PHP
laravel5环境隐藏index.php后缀(apache)的方法
Oct 12 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 七大优势分析
2009/06/23 PHP
使用array_map简单搞定PHP删除文件、删除目录
2014/10/29 PHP
PHP实现二叉树的深度优先与广度优先遍历方法
2015/09/28 PHP
如何实现动态删除javascript函数
2007/05/27 Javascript
[推荐]javascript 面向对象技术基础教程
2009/03/03 Javascript
js querySelector和getElementById通过id获取元素的区别
2012/04/20 Javascript
别了 JavaScript中的isXX系列
2012/08/01 Javascript
关于js遍历表格的实例
2013/07/10 Javascript
Extjs NumberField后面加单位实现思路
2013/07/30 Javascript
JQUERY 获取IFrame中对象及获取其父窗口中对象示例
2013/08/19 Javascript
利用window.name实现windowStorage代码分享
2014/01/02 Javascript
浅析jquery某一元素重复绑定的问题
2014/01/03 Javascript
跟我学习javascript创建对象(类)的8种方法
2015/11/20 Javascript
js如何改变文章的字体大小
2016/01/08 Javascript
有关easyui-layout中的收缩层无法显示标题的解决办法
2016/05/10 Javascript
基于JS实现导航条flash导航条
2016/06/17 Javascript
浅谈 Vue 项目优化的方法
2017/12/16 Javascript
浅谈在vue中用webpack打包之后运行文件的问题以及相关配置方法
2018/02/21 Javascript
JavaScript键盘事件常见用法实例分析
2019/01/03 Javascript
JavaScript设计模式之责任链模式实例分析
2019/01/16 Javascript
layui form表单提交之后重新加载数据表格的方法
2019/09/11 Javascript
微信小程序 下拉刷新及上拉加载原理解析
2019/11/06 Javascript
详解Vue中的自定义指令
2020/12/07 Vue.js
[00:27]DOTA2次级职业联赛 - Lilith战队宣传片
2014/12/01 DOTA
Python中Selenium模拟JQuery滑动解锁实例
2017/07/26 Python
Python装饰器语法糖
2019/01/02 Python
Python 实现微信自动回复的方法
2020/09/11 Python
python实现网页录音效果
2020/10/26 Python
布里斯班女装时尚品牌:Adrift
2017/12/28 全球购物
芬兰灯具网上商店:Nettilamppu.fi
2018/06/30 全球购物
书法兴趣小组活动总结
2014/07/07 职场文书
租房协议书
2014/09/12 职场文书
银行招聘自荐信
2015/03/06 职场文书
企业党建工作总结2015
2015/05/26 职场文书
开学第一周总结
2015/07/16 职场文书
angular异步验证器防抖实例详解
2022/03/31 Javascript