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中mail函数发送邮件失败的解决方法
Dec 24 PHP
php常见的魔术方法详解
Dec 25 PHP
PHP CURL 内存泄露问题解决方法
Feb 12 PHP
php从数据库查询结果生成树形列表的方法
Apr 17 PHP
PHP输入流php://input实例讲解
Dec 22 PHP
详解PHP swoole process的使用方法
Aug 26 PHP
PHP 传输会话curl函数的实例详解
Sep 12 PHP
Laravel如何使用Redis共享Session
Feb 23 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
Apr 27 PHP
PHP微信发送推送消息乱码的解决方法
Feb 28 PHP
php简单检测404页面的方法示例
Aug 23 PHP
Thinkphp 在api开发中异常返回依然是html的解决方式
Oct 16 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
我的论坛源代码(三)
2006/10/09 PHP
基于mysql的论坛(7)
2006/10/09 PHP
PHP的一个完美GIF等比缩放类,附带去除缩放黑背景
2014/04/01 PHP
PHP微信开发之二维码生成类
2015/06/26 PHP
在CentOS上搭建LAMP+vsftpd环境的简单指南
2015/08/01 PHP
教你php如何实现验证码
2016/01/20 PHP
PHP实现的曲线统计图表示例
2016/11/10 PHP
php中请求url的五种方法总结
2017/07/13 PHP
PHP+百度AI OCR文字识别实现了图片的文字识别功能
2019/05/08 PHP
精通Javascript系列之Javascript基础篇
2011/06/07 Javascript
Jquery中的CheckBox、RadioButton、DropDownList的取值赋值实现代码
2011/10/12 Javascript
JavaScript转换农历类实现及调用方法
2013/01/27 Javascript
js 加密压缩出现bug解决方案
2014/11/25 Javascript
JS实现合并两个数组并去除重复项只留一个的方法
2015/12/17 Javascript
解决jQuery ajax请求在IE6中莫名中断的问题
2016/06/20 Javascript
Bootstrap中点击按钮后变灰并显示加载中实例代码
2016/09/23 Javascript
AngularJS验证信息框架的封装插件用法【w5cValidator扩展插件】
2016/11/03 Javascript
ES6中的rest参数与扩展运算符详解
2017/07/18 Javascript
angular4中关于表单的校验示例
2017/10/16 Javascript
微信小程序canvas拖拽、截图组件功能
2018/09/04 Javascript
在Create React App中使用CSS Modules的方法示例
2019/01/15 Javascript
Vue 递归多级菜单的实例代码
2019/05/05 Javascript
详解小程序开发经验:多页面数据同步
2019/05/18 Javascript
理解JavaScript中的Proxy 与 Reflection API
2020/09/21 Javascript
[54:30]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python中lambda的用法及其与def的区别解析
2014/07/28 Python
python接口调用已训练好的caffe模型测试分类方法
2019/08/26 Python
python异常处理和日志处理方式
2019/12/24 Python
使用CSS禁止textarea调整大小功能的方法
2015/03/13 HTML / CSS
高二地理教学反思
2014/01/24 职场文书
设立有限责任公司出资协议书
2014/11/01 职场文书
大学生创业事迹材料
2014/12/30 职场文书
python生成可执行exe控制Microsip自动填写号码并拨打功能
2021/06/21 Python
MySql 8.0及对应驱动包匹配的注意点说明
2021/06/23 MySQL
ICOM R71E和R72E图文对比解说
2022/04/07 无线电
以MySQL5.7为例了解一下执行计划
2022/04/13 MySQL