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网站提速三大“软”招
Oct 09 PHP
mysql limit查询优化分析
Nov 12 PHP
PHP 开发环境配置(Zend Studio)
Apr 28 PHP
浅析php fwrite写入txt文件的时候用 \r\n不能换行的问题
Aug 06 PHP
部署PHP项目应该注意的几点事项分享
Dec 20 PHP
微信公众平台之快递查询功能用法实例
Apr 14 PHP
php基于CodeIgniter实现图片上传、剪切功能
May 14 PHP
Yii2组件之多图上传插件FileInput的详细使用教程
Jun 20 PHP
PHP生成各种随机验证码的方法总结【附demo源码】
Jun 05 PHP
浅谈ThinkPHP5.0版本和ThinkPHP3.2版本的区别
Jun 17 PHP
PHP array_shift()用法实例分析
Jan 07 PHP
laravel5 Eloquent 实现事务方式
Oct 21 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/03/25 PHP
比file_get_contents稳定的curl_get_contents分享
2012/01/11 PHP
PHP中的reflection反射机制测试例子
2014/08/05 PHP
PHP获取ip对应地区和使用网络类型的方法
2015/03/11 PHP
redis+php实现微博(二)发布与关注功能详解
2019/09/23 PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
2019/10/15 PHP
如果文字过长,则将过长的部分变成省略号显示
2006/06/26 Javascript
读jQuery之七 判断点击了鼠标哪个键的代码
2011/06/21 Javascript
JS实现图片翻书效果示例代码
2013/09/09 Javascript
js带按钮的提示框可供选择示例代码
2013/09/17 Javascript
jQuery表格列宽可拖拽改变且兼容firfox
2014/09/03 Javascript
js网页右下角提示框实例
2014/10/14 Javascript
JS数组(Array)处理函数整理
2014/12/07 Javascript
JavaScript+html5 canvas绘制的小人效果
2016/01/27 Javascript
基于jQuery的$.getScript方法去加载javaScript文档解析
2017/11/08 jQuery
JS使用JSON.parse(),JSON.stringify()实现对对象的深拷贝功能分析
2019/03/06 Javascript
微信小程序云开发之新手环境配置
2019/05/16 Javascript
在python的类中动态添加属性与生成对象
2016/09/17 Python
twilio python自动拨打电话,播放自定义mp3音频的方法
2019/08/08 Python
python爬虫开发之Beautiful Soup模块从安装到详细使用方法与实例
2020/03/09 Python
Python多线程通信queue队列用法实例分析
2020/03/24 Python
Django模型中字段属性choice使用说明
2020/03/30 Python
世界领先的艺术图书出版社:TASCHEN
2018/07/23 全球购物
AMAVII眼镜官网:时尚和设计师太阳镜
2019/05/05 全球购物
圣诞树世界:Christmas Tree World
2019/12/10 全球购物
俄罗斯厨房产品购物网站:COOK HOUSE
2021/03/15 全球购物
ddl,dml和dcl的含义
2016/05/08 面试题
施工班组长岗位职责
2014/01/05 职场文书
金融系应届毕业生求职信
2014/05/26 职场文书
小学假期安全广播稿
2014/09/28 职场文书
2014年应急管理工作总结
2014/11/26 职场文书
城南旧事观后感
2015/06/11 职场文书
php TP5框架生成二维码链接
2021/04/01 PHP
python实现过滤敏感词
2021/05/08 Python
详解缓存穿透击穿雪崩解决方案
2021/05/28 Redis
Python连接Postgres/Mysql/Mongo数据库基本操作大全
2021/06/29 Python