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 相关文章推荐
BBS(php &amp; mysql)完整版(六)
Oct 09 PHP
PHP表单提交表单名称含有点号(.)则会被转化为下划线(_)
Dec 14 PHP
PHP判断搜索引擎蜘蛛并自动记忆到文件的代码
Feb 04 PHP
PHP采用XML-RPC构造Web Service实例教程
Jul 16 PHP
php使用sql server验证连接数据库的方法
Dec 25 PHP
ecshop适应在PHP7的修改方法解决报错的实现
Nov 01 PHP
简单实现PHP留言板功能
Dec 21 PHP
php删除数组指定元素实现代码
May 03 PHP
基于ThinkPHP5.0实现图片上传插件
Sep 25 PHP
Yii2语言国际化的配置教程
Aug 19 PHP
PHP实现简易计算器功能
Aug 28 PHP
php字符串过滤strip_tags()函数用法实例分析
Jun 24 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
虹吸式咖啡壶操作
2021/03/03 冲泡冲煮
咖啡产品发展的三大浪潮
2021/03/04 咖啡文化
手把手教你打印出PDF(关于fpdf的简单应用)
2013/06/25 PHP
php通过递归方式复制目录和子目录的方法
2015/03/13 PHP
PHP中file_get_contents函数抓取https地址出错的解决方法(两种方法)
2015/09/22 PHP
php实现基于openssl的加密解密方法
2016/09/30 PHP
PHP注释语法规范与命名规范详解篇
2018/01/21 PHP
发现的以前不知道的函数
2006/09/19 Javascript
js中return false(阻止)的用法
2013/08/14 Javascript
JavaScript改变HTML元素的样式改变CSS及元素属性
2013/11/12 Javascript
BOOTSTRAP时间控件显示在模态框下面的bug修复
2015/02/05 Javascript
JS/jQ实现免费获取手机验证码倒计时效果
2016/06/13 Javascript
jQuery实现文字自动横移
2017/01/08 Javascript
vue2 如何实现div contenteditable=“true”(类似于v-model)的效果
2017/02/08 Javascript
微信小程序三级联动选择器使用方法
2020/05/19 Javascript
jQuery length 和 size()区别总结
2018/04/26 jQuery
Vue子组件向父组件通信与父组件调用子组件中的方法
2018/06/22 Javascript
JS简单判断是否在微信浏览器打开的方法示例
2019/01/08 Javascript
利用原生JS实现data方法示例代码
2019/05/28 Javascript
javascript实现下拉菜单效果
2021/02/09 Javascript
Windows下用py2exe将Python程序打包成exe程序的教程
2015/04/08 Python
python实现根据指定字符截取对应的行的内容方法
2018/10/23 Python
CentOS下Python3的安装及创建虚拟环境的方法
2018/11/28 Python
python GUI库图形界面开发之PyQt5树形结构控件QTreeWidget详细使用方法与实例
2020/03/02 Python
AJAX的优缺点都有什么
2015/08/18 面试题
财务会计毕业生自荐信
2013/11/02 职场文书
妇科医生自荐信
2013/11/05 职场文书
幼儿教育感言
2014/02/05 职场文书
年终总结会议主持词
2014/03/17 职场文书
机械专业技术员求职信
2014/06/14 职场文书
2014年合同管理工作总结
2014/12/02 职场文书
公务员政审材料范文
2014/12/23 职场文书
服务明星事迹材料
2014/12/29 职场文书
预备党员表决心的话
2015/09/22 职场文书
《巨人的花园》教学反思
2016/02/19 职场文书
Java中的随机数Random
2022/03/17 Java/Android