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自定义函数返回多个值
Nov 26 PHP
php+mysql开源XNA 聚合程序发布 下载
Jul 13 PHP
PHP 实用代码收集
Jan 22 PHP
浅谈apache和nginx的rewrite的区别
Feb 22 PHP
PHP批量上传图片的具体实现方法介绍.
Feb 26 PHP
thinkphp模板用法和内容输出实例
Nov 28 PHP
php使用cookie保存用户登录的用户名实例
Jan 26 PHP
php版微信公众平台开发之验证步骤实例详解
Sep 23 PHP
PHP中OpenSSL加密问题整理
Dec 14 PHP
PHP中一个有趣的preg_replace函数详解
Aug 15 PHP
yii2 上传图片的示例代码
Nov 02 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引用地址改变变量值的问题
2012/03/23 PHP
php配置php-fpm启动参数及配置详解
2013/11/04 PHP
浅谈php扩展imagick
2014/06/02 PHP
php常量详细解析
2015/10/27 PHP
php+redis消息队列实现抢购功能
2018/02/08 PHP
javascript中对对层的控制
2006/12/29 Javascript
用javascript实现给出的盒子的序列是否可连为一矩型
2007/08/30 Javascript
JavaScript高级程序设计 阅读笔记(七) ECMAScript中的语句
2012/02/27 Javascript
浅谈javascript中的作用域
2012/04/07 Javascript
jQuery旋转插件—rotate支持(ie/Firefox/SafariOpera/Chrome)
2013/01/16 Javascript
关于js内存泄露的一个好例子
2013/12/09 Javascript
JavaScript编程中布尔对象的基本使用
2015/10/25 Javascript
浅谈jquery.form.js的ajaxSubmit和ajaxForm的使用
2016/09/09 Javascript
Angular Module声明和获取重载实例代码
2016/09/14 Javascript
vue2 中如何实现动态表单增删改查实例
2017/06/09 Javascript
vue复合组件实现注册表单功能
2017/11/06 Javascript
JS选取DOM元素常见操作方法实例分析
2018/12/10 Javascript
javascript头像上传代码实例
2019/09/28 Javascript
js实现踩五彩块游戏
2020/02/08 Javascript
浅谈Python 字符串格式化输出(format/printf)
2016/07/21 Python
基于Django框架利用Ajax实现点赞功能实例代码
2018/08/19 Python
python爬虫基础教程:requests库(二)代码实例
2019/04/09 Python
PyTorch笔记之scatter()函数的使用
2020/02/12 Python
keras之权重初始化方式
2020/05/21 Python
Python可以实现栈的结构吗
2020/05/27 Python
python定时截屏实现
2020/11/02 Python
美国最佳选择产品网站:Best Choice Products
2019/05/27 全球购物
为数据库创建索引都需要注意些什么
2012/07/17 面试题
简历中个人求职的自我评价模板
2013/11/29 职场文书
数学教学随笔感言
2014/02/17 职场文书
暑期培训随笔感言
2014/03/10 职场文书
建筑施工安全责任书
2014/07/24 职场文书
纪检干部个人对照检查材料
2014/09/23 职场文书
小学教师师德整改措施
2014/09/29 职场文书
护理心得体会范文
2016/01/22 职场文书
JavaScript 去重和重复次数统计
2021/03/31 Javascript