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 相关文章推荐
Search Engine Friendly的URL设计
Oct 09 PHP
php判断变量类型常用方法
Apr 24 PHP
php加密解密函数authcode的用法详细解析
Oct 28 PHP
PHP中Fatal error session_start()错误解决步骤
Aug 05 PHP
php实现的数字验证码及数字运算验证码
Jul 30 PHP
php上传功能集后缀名判断和随机命名(强力推荐)
Sep 10 PHP
理解php依赖注入和控制反转
May 11 PHP
10个值得深思的PHP面试题
Nov 14 PHP
PHP实现从上往下打印二叉树的方法
Jan 18 PHP
php判断目录存在的简单方法
Sep 26 PHP
php多进程并发编程防止出现僵尸进程的方法分析
Feb 28 PHP
PHP基于array_unique实现二维数组去重
Jul 14 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做下载文件的实现代码及文件名中乱码解决方法
2011/02/03 PHP
使用php验证复选框有效性的示例
2013/11/13 PHP
PHP中date与gmdate的区别及默认时区设置
2014/05/12 PHP
微信自定义菜单的创建/查询/取消php示例代码
2016/08/05 PHP
PHP 信号管理知识整理汇总
2017/02/19 PHP
匹配任意字符的正则表达式写法
2010/04/29 Javascript
jQuery 源码分析笔记(7) Queue
2011/06/19 Javascript
JavaScript的递归之递归与循环示例介绍
2013/08/05 Javascript
Jquery下EasyUI组件中的DataGrid结果集清空方法
2014/01/06 Javascript
JS实现的表格行鼠标点击高亮效果代码
2015/11/27 Javascript
jquery ajax局部加载方法详解(实现代码)
2016/05/12 Javascript
图解prototype、proto和constructor的三角关系
2016/07/31 Javascript
Node.js 数据加密传输浅析
2016/11/16 Javascript
jquery,js简单实现类似Angular.js双向绑定
2017/01/13 Javascript
浅析JS中常用类型转换及运算符表达式
2017/07/23 Javascript
vue中的mvvm模式讲解
2019/01/31 Javascript
浅谈vuex的基本用法和mapaction传值问题
2019/11/08 Javascript
微信小程序开发之获取用户手机号码(php接口解密)
2020/05/17 Javascript
[03:48]显微镜下的DOTA2第四期——TP动作
2014/06/20 DOTA
[46:47]完美世界DOTA2联赛PWL S2 FTD vs Magma 第二场 11.20
2020/11/23 DOTA
python Django框架实现自定义表单提交
2016/03/25 Python
解决Python的str强转int时遇到的问题
2018/04/09 Python
Linux CentOS Python开发环境搭建教程
2018/11/28 Python
Python3实现汉语转换为汉语拼音
2019/07/08 Python
Python3 执行Linux Bash命令的方法
2019/07/12 Python
Python3.7+tkinter实现查询界面功能
2019/12/24 Python
基于TensorBoard中graph模块图结构分析
2020/02/15 Python
在python中使用pyspark读写Hive数据操作
2020/06/06 Python
Mio Skincare法国官网:身体紧致及孕期身体护理
2018/04/04 全球购物
学院书画协会部门职责
2013/11/28 职场文书
公司中秋节活动方案
2014/02/12 职场文书
2014年国庆晚会主持词
2014/09/19 职场文书
2014高三学生考试作弊检讨书
2014/12/14 职场文书
JS Object构造函数之Object.freeze
2021/04/28 Javascript
Vue自定义铃声提示音组件的实现
2022/01/22 Vue.js
铁头也玩根德 YachtBoy YB-230......
2022/04/05 无线电