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 相关文章推荐
JAVA/JSP学习系列之四
Oct 09 PHP
php中数据的批量导入(csv文件)
Oct 09 PHP
php chr() ord()中文截取乱码问题解决方法
Sep 08 PHP
PHP中去除换行解决办法小结(PHP_EOL)
Nov 27 PHP
浅析PKI加密解密 OpenSSL
Jul 01 PHP
getJSON跨域SyntaxError问题分析
Aug 07 PHP
PHP基于单例模式编写PDO类的方法
Sep 13 PHP
自制PHP框架之设计模式
May 07 PHP
ThinkPHP开发--使用七牛云储存
Sep 14 PHP
PHP实现从上往下打印二叉树的方法
Jan 18 PHP
实例介绍PHP删除数组中的重复元素
Mar 03 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
Apr 04 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实现查询百度google收录情况(示例代码)
2013/08/02 PHP
php禁止直接从浏览器输入地址访问.php文件的方法
2014/11/04 PHP
splice slice区别
2006/10/09 Javascript
XML+XSL 与 HTML 两种方案的结合
2007/04/22 Javascript
[原创]站长必须要知道的javascript广告代码
2007/05/30 Javascript
用js实现上传图片前的预览(TX的面试题)
2007/08/14 Javascript
javascript 支持ie和firefox杰奇翻页函数
2008/07/22 Javascript
下拉菜单点击实现连接跳转功能的js代码
2013/05/19 Javascript
jQuery中prevUntil()方法用法实例
2015/01/08 Javascript
javascript比较两个日期相差天数的方法
2015/07/24 Javascript
js实现带三角符的手风琴效果
2017/03/01 Javascript
jQuery 实现双击编辑表格功能
2017/06/19 jQuery
原生js实现密码输入框值的显示隐藏
2017/07/17 Javascript
ES6正则表达式扩展笔记
2017/07/25 Javascript
Vue实现搜索 和新闻列表功能简单范例
2018/03/16 Javascript
webpack v4 从dev到prd的方法
2018/04/02 Javascript
element ui分页多选,翻页记忆的实例
2019/09/03 Javascript
微信小程序JS加载esmap地图的实例详解
2019/09/04 Javascript
JavaScript设计模型Iterator实例解析
2020/01/22 Javascript
Vue 简单实现前端权限控制的示例
2020/12/25 Vue.js
[00:32]2018DOTA2亚洲邀请赛Secret出场
2018/04/03 DOTA
浅谈Python里面小数点精度的控制
2018/07/16 Python
python将控制台输出保存至文件的方法
2019/01/07 Python
PyQt5实现从主窗口打开子窗口的方法
2019/06/19 Python
Python 离线工作环境搭建的方法步骤
2019/07/29 Python
Python笔试面试题小结
2019/09/07 Python
使用Python完成15位18位身份证的互转功能
2019/11/06 Python
如何解决cmd运行python提示不是内部命令
2020/07/01 Python
国外平面设计第一市场:99designs
2016/10/25 全球购物
马来西亚在线药房:RoyalePharma
2019/12/01 全球购物
Perfume’s Club美国官网:西班牙第一家在线美容店
2020/06/10 全球购物
营业员演讲稿
2013/12/30 职场文书
一年级学生评语大全
2014/04/21 职场文书
thinkphp 获取控制器及控制器方法
2021/04/16 PHP
「Manga Time Kirara MAX」2022年5月号封面公开
2022/03/21 日漫
win10重装系统后上不了网怎么办 win10重装系统网络故障的解决办法
2022/07/23 数码科技