php验证码生成器


Posted in PHP onMay 24, 2017

现在很多网站都有实现用户集。然而为了防止机器人的网络攻击。限制登陆或者注册是有必要的。
在注册和登陆时强制要求输入一个机器难以识别的字符串集是一个不错的选择。虽然不能解决根本问题,但至少可以增加他们的成本。

利用PHP生成验证码需要用到GD2库。GD2库引用方法网络上有很多,不同操作系统导入方式也不同。

这段代码运行在WINDOS服务器平台

<?php
$iC = new idCode(5,60,30);
$iC->createPNG();

class idCode{
  private $words = array('a','b',
  'c','d','e','f','g','h','i','j','k','l',
  'm','n','o','p','q','r','s','t','u','v',
  'w','x','y','z','A','B','C','D','E','F',
  'G','H','I','J','K','L','M','N','O','P',
  'Q','R','S','T','U','V','W','X','Y','Z',
  '0','1','2','3','4','5','6','7','8','9');
  private $fonts;
  private $count;//验证码字符数
  private $height;
  private $width;
  private $path = '..\myfolder\fonts';
  private $keys;

  //构造函数
  public function __construct($count,$width,$height){
    $this->count = $count;
    $this->getFonts();
    $this->height = $height;
    $this->width = $width;
  }

  private function getFonts(){
    $dir = dir($this->path);

    while(false !== ($file = $dir->read())){
        if($file != '.' && $file != '..'){
          $this->fonts[count($this->fonts)] = basename($file);
        }
    }
    $dir->close();
  }

  private function createKeys(){
    for($i = 0;$i < $this->count;$i++){
      $this->keys[$i]['char'] = $this->words[rand(0,count($this->words)-1)];
      //使用字体路径标识
      $this->keys[$i]['filename'] = $this->path.'\\'.$this->fonts[rand(0,count($this->fonts)-1)];
    }
  }

  public function createPNG(){
    $this->createKeys();

    //创建画布以及颜色块儿
    $bg = imagecreatetruecolor($this->width + 10*2,$this->height + 3*2);//两边留10px空白,上下3px
    $grey = imagecolorallocate($bg,155,155,155);
    $blue = imagecolorallocate($bg,0x00,0x00,0xff);
    //填充背景
    imagefill($bg,0,0,$grey);
    //添加字符
    $pwidth = $this->width/$this->count;
    $x;$y;
    for($i = 0;$i < $this->count;$i++){
      $rotation = rand(-40,40);//偏转角度±40°
      $fontsize = 33;
      $width_txt;
      $height_txt;

      do{
        $fontsize--;
        $bbox = imagettfbbox($fontsize,$rotation,$this->keys[$i]['filename'],$this->keys[$i]['char']);
        $width_txt = $bbox[2] - $bbox[0];//x 0 2 4 6,y1 3 5 7;左下,右下,右上,左上
        $height_txt = $bbox[7] - $bbox[1];
      }while($fontsize > 8 && ($height_txt > $this->height || $width_txt > $pwidth));

      $fontcolor = imagecolorallocate($bg,rand(0,255),rand(0,255),rand(0,255));
      $x = 8 + $pwidth*$i + $pwidth/2 - $width_txt/2;//x坐标基本位置
      $y = $this->height/2 - $height_txt/2;

      imagettftext($bg,$fontsize,$rotation,$x,$y,$fontcolor,$this->keys[$i]['filename'],$this->keys[$i]['char']);
    }
    //绘制干扰线
    //根据字体酌情增加干扰线
    imageline($bg,0,15,40,10,$blue);
    //图像输出头文件
    header('Content-type:image/png');
    //输出png图像
    imagepng($bg);
    //清除缓存资源
    imagedestroy($bg);
  }

  public function checkKeys($input){
    if(count($input)!=$this->count){
      return 'ERROR:长度不正确.';
    }else{
      for($i=0;$i < $this->count;$i++){
        //0 o O I l 1 校准,根据所选择的字体确定是否需要手动校准
        if($input[$i] != $this->keys[$i]['char']){
          return 'SUCCESS.';
        }else{
          return 'ERROR:请输入正确验证码.';
        }
      }
    }
  }
}
?>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
关于BIG5-HKSCS的解决方法
Mar 20 PHP
GBK的页面输出JSON格式的php函数
Feb 16 PHP
php数组函数序列之each() - 获取数组当前内部指针所指向元素的键名和键值,并将指针移到下一位
Oct 31 PHP
PHP高级对象构建 多个构造函数的使用
Feb 05 PHP
PHP 常用数组内部函数(Array Functions)介绍
Jun 05 PHP
php之XML转数组函数的详解
Jun 07 PHP
PHP Curl多线程原理实例详解
Nov 06 PHP
PHP的switch判断语句的“高级”用法详解
Oct 01 PHP
php使用session二维数组实例
Nov 06 PHP
php检测apache mod_rewrite模块是否安装的方法
Mar 14 PHP
PHP验证码类ValidateCode解析
Jan 07 PHP
微信公众平台开发教程④ ThinkPHP框架下微信支付功能图文详解
Apr 10 PHP
php批量修改表结构实例
May 24 #PHP
php 人员权限管理(RBAC)实例(推荐)
May 24 #PHP
老生常谈PHP面向对象之命令模式(必看篇)
May 24 #PHP
php实现查询功能(数据访问)
May 23 #PHP
php批量删除操作(数据访问)
May 23 #PHP
[原创]PHP正则删除html代码中a标签并保留标签内容的方法
May 23 #PHP
php出租房数据管理及搜索页面
May 23 #PHP
You might like
sourcesafe管理phpproj文件的补充说明(downmoon)
2009/04/11 PHP
浅析iis7.5安装配置php环境
2015/05/10 PHP
php检测图片主要颜色的方法
2015/07/01 PHP
Ubuntu下安装PHP的mongodb扩展操作命令
2015/07/04 PHP
PHP使用array_merge重新排列数组下标的方法
2015/07/22 PHP
Yii框架通过请求组件处理get,post请求的方法分析
2019/09/03 PHP
document对象execCommand的command参数介绍
2006/08/01 Javascript
枚举JavaScript对象的函数
2006/12/22 Javascript
jQuery实现列表自动循环滚动鼠标悬停时停止滚动
2013/09/06 Javascript
Document.location.href和.replace的区别示例介绍
2014/03/04 Javascript
js实现有时间限制消失的图片方法
2015/02/27 Javascript
浅析Javascript中bind()方法的使用与实现
2016/04/29 Javascript
基于JS实现导航条之调用网页助手小精灵的方法
2016/06/17 Javascript
Zabbix添加Node.js监控的方法
2016/10/20 Javascript
canvas绘制环形进度条
2017/02/23 Javascript
使用requirejs模块化开发多页面一个入口js的使用方式
2017/06/14 Javascript
vue系列之requireJs中引入vue-router的方法
2018/07/18 Javascript
Node.js实现用户评论社区功能(体验前后端开发的乐趣)
2019/05/09 Javascript
Vue中jsx不完全应用指南小结
2019/11/01 Javascript
Linux中安装Python的交互式解释器IPython的教程
2016/06/13 Python
浅谈python中的实例方法、类方法和静态方法
2017/02/17 Python
Python中三元表达式的几种写法介绍
2019/03/04 Python
Python3.5迭代器与生成器用法实例分析
2019/04/30 Python
深入浅析python 协程与go协程的区别
2019/05/09 Python
Python用字典构建多级菜单功能
2019/07/11 Python
德国香水、化妆品和护理产品网上商店:Parfumdreams
2018/09/26 全球购物
怎样创建、运行java程序
2014/08/01 面试题
高级Java程序员面试要点
2013/08/02 面试题
教育孩子心得体会
2014/01/01 职场文书
教师个人剖析材料
2014/02/05 职场文书
2014年民主评议党员个人总结
2014/09/24 职场文书
2014年无财产无子女离婚协议书范本
2014/10/09 职场文书
2015年六一儿童节活动方案
2015/05/05 职场文书
拾金不昧表扬稿大全
2015/05/05 职场文书
预备党员入党感言
2015/08/01 职场文书
教你用python控制安卓手机
2021/05/13 Python