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 相关文章推荐
php下防止单引号,双引号在接受页面转义的设置方法
Sep 25 PHP
PHP中json_encode、json_decode与serialize、unserialize的性能测试分析
Jun 09 PHP
解析在apache里面给php写虚拟目录的详细方法
Jun 24 PHP
IIS安装Apache伪静态插件的具体操作图文
Jul 01 PHP
PHP常用处理静态操作类
Apr 03 PHP
php实现中文转数字
Feb 18 PHP
Laravel 中使用 Vue.js 实现基于 Ajax 的表单提交错误验证操作
Jun 30 PHP
Laravel框架实现利用监听器进行sql语句记录功能
Jun 06 PHP
在Laravel的Model层做数据缓存的实现
Sep 26 PHP
php 多继承的几种常见实现方法示例
Nov 18 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
Nov 19 PHP
ThinkPHP5框架中使用JWT的方法示例
Jun 03 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
php cookis创建实现代码
2009/03/16 PHP
PHP往XML中添加节点的方法
2015/03/12 PHP
php unicode编码和字符串互转的方法
2020/08/12 PHP
php常用的工具开发整理
2019/09/26 PHP
JavaScript修改css样式style动态改变元素样式
2013/12/16 Javascript
Javascript 构造函数详解
2014/10/22 Javascript
js实现简洁的TAB滑动门效果代码
2015/09/06 Javascript
Bootstrap 3 进度条的实现
2017/02/22 Javascript
详解vue组件通信的三种方式
2017/06/30 Javascript
使用Node.js实现ORM的一种思路详解(图文)
2017/10/24 Javascript
vue-cli结合Element-ui基于cropper.js封装vue实现图片裁剪组件功能
2018/03/01 Javascript
Vue实现table上下移动功能示例
2019/02/21 Javascript
用node.js写一个jenkins发版脚本
2019/05/21 Javascript
nodejs读取图片返回给浏览器显示
2019/07/25 NodeJs
原生js实现点击轮播切换图片
2020/02/11 Javascript
python和ruby,我选谁?
2017/09/13 Python
numpy排序与集合运算用法示例
2017/12/15 Python
对python .txt文件读取及数据处理方法总结
2018/04/23 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
2019/05/27 Python
python 获取等间隔的数组实例
2019/07/04 Python
Python实现的北京积分落户数据分析示例
2020/03/27 Python
Python数据可视化图实现过程详解
2020/06/12 Python
python实现简单猜单词游戏
2020/12/24 Python
详解rem 适配布局
2018/10/31 HTML / CSS
美国高街时尚品牌:OASAP
2016/07/24 全球购物
英国最大的化装舞会服装网站:Fancydress.com
2017/08/15 全球购物
美国领先的水果篮送货公司和新鲜水果供应商:The Fruit Company
2018/02/13 全球购物
Nobody Denim官网:购买高级女士牛仔裤
2021/03/15 全球购物
森马旗舰店双十一营销方案
2014/09/29 职场文书
2014工程部年度工作总结
2014/12/17 职场文书
2015年党员创先争优承诺书
2015/01/22 职场文书
入党宣誓仪式主持词
2015/06/29 职场文书
大学生先进个人主要事迹材料
2015/11/04 职场文书
找规律教学反思
2016/02/23 职场文书
适合后台管理系统开发的12个前端框架(小结)
2021/06/29 Javascript
据Python爬虫不靠谱预测可知今年双十一销售额将超过6000亿元
2021/11/11 Python