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 相关文章推荐
浅谈Windows下 PHP4.0与oracle 8的连接设置
Oct 09 PHP
常见的PHP五种设计模式小结
Mar 23 PHP
详解PHP数组赋值方法
Nov 07 PHP
PHP使用redis实现统计缓存mysql压力的方法
Nov 14 PHP
学习php设计模式 php实现享元模式(flyweight)
Dec 07 PHP
Symfony2 session用法实例分析
Feb 04 PHP
使用JavaScript创建新样式表和新样式规则
Jun 14 PHP
php的laravel框架快速集成微信登录的方法
Dec 12 PHP
PHP实现求解最长公共子串问题的方法
Nov 17 PHP
PHP编程实现的TCP服务端和客户端功能示例
Apr 13 PHP
tp5 sum某个字段相加得到总数的例子
Oct 18 PHP
PHP 对象接口简单实现方法示例
Apr 13 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中集成PayPal标准支付的实现方法分享
2012/02/06 PHP
深入解析fsockopen与pfsockopen的区别
2013/07/05 PHP
laravel安装zend opcache加速器教程
2015/03/02 PHP
PHP7.0安装笔记整理
2015/08/28 PHP
自定义min版smarty模板引擎MinSmarty.class.php文件及用法
2016/05/20 PHP
PHP7 其他语言层面的修改
2021/03/09 PHP
Google Map Api和GOOGLE Search Api整合实现代码
2009/07/18 Javascript
javascript下判断一个对象是否具有指定名称的属性的的代码
2010/01/11 Javascript
用Javascript实现Windows任务管理器的代码
2012/03/27 Javascript
自编jQuery插件实现模拟alert和confirm
2014/09/01 Javascript
使表格的标题列可左右拉伸jquery插件封装
2014/11/24 Javascript
信息页文内画中画广告js实现代码(文中加载广告方式)
2016/01/03 Javascript
详谈Angular路由与Nodejs路由的区别
2017/03/05 NodeJs
Bootstrap table中toolbar新增条件查询及refresh参数使用方法
2018/05/18 Javascript
微信小程序自定义组件实现tabs选项卡功能
2018/07/14 Javascript
详解vue如何使用rules对表单字段进行校验
2018/10/17 Javascript
小程序开发中如何使用async-await并封装公共异步请求的方法
2019/01/20 Javascript
浅谈Javascript中的对象和继承
2019/04/19 Javascript
Python类的基础入门知识
2008/11/24 Python
Python实现的简单文件传输服务器和客户端
2015/04/08 Python
JSONLINT:python的json数据验证库实例解析
2017/11/28 Python
python使用Pycharm创建一个Django项目
2018/03/05 Python
python使用代理ip访问网站的实例
2018/05/07 Python
tensorflow使用神经网络实现mnist分类
2018/09/08 Python
python词云库wordCloud使用方法详解(解决中文乱码)
2020/02/17 Python
重写django的model下的objects模型管理器方式
2020/05/15 Python
Python实现EM算法实例代码
2020/10/04 Python
Numpy中np.max的用法及np.maximum区别
2020/11/27 Python
python爬虫中url管理器去重操作实例
2020/11/30 Python
中国第一家杂志折扣订阅网:杂志铺
2016/08/30 全球购物
Servlet的实例是在生命周期什么时候创建的?配置servlet最重要的是什么?
2012/05/30 面试题
大学生党员批评与自我批评
2014/09/28 职场文书
2015年高二班主任工作总结
2015/05/25 职场文书
企业管理制度设计时要注意的几种“常见病”!
2019/04/19 职场文书
CSS3实现三角形不断放大效果
2021/04/13 HTML / CSS
Java数据结构之堆(优先队列)
2022/05/20 Java/Android