资讯专栏INFORMATION COLUMN

PHP常用操作类实现——验证码类

Jrain / 1963人阅读

摘要:验证码是什么验证码是自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计算机和人的全自动程序。验证码的种类文字数字字母统称字符图片语音手势对于不同的验证码,验证的设计思路是一致的,我们以字符为例。

概述

谢谢大家的收藏与赞,这是对我最大的鼓励。

这一系列文章主要是一些PHP常用的类操作,回顾一下面向对象,我一直致力于小白文章的撰写,因为我也是小白,相信有人需要,希望读者能够喜欢。

说明

关于PHP语言实现各种操作类,网上都能够找得到,但是质量参差不齐,有的代码不好懂,有时候看的眼花缭乱,所以我在这里统一作了一个整理(注意:是整理,每一种操作类,我至少会参考三份优秀代码,然后自己跑出来,而不是CV)

我会尽量遵守PSR规范,会有很详细易懂的注释

对于其中涉及到的相关知识点,比如设计模式,类型检测、浏览器架构、通信数据我也会简单讲讲,并留下相关链接,希望读者能够细嚼慢咽

阅读准备

内容涉及面向对象、数据库、文件操作、购物车、分页、图像处理、JSON数据接口,你可能需要有一点知识基础,当然,这些内容都是独立的,可以选择性的参看。

为什么要验证码?

尽管现在很多业务是直接通过短信验证用户身份,但是还是有许多场景和使用习惯需要用到验证码;另外, 在登录网站时,为了提高网站的安全性,屏蔽机器请求,避免用户”灌水“等行为,经常需要输入各种各样的验证码。

验证码是什么?

验证码是自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计算机和人的全自动程序。

验证码的种类?

文字、数字、字母(统称字符)
图片
语音
手势

对于不同的验证码,验证的设计思路是一致的,我们以字符为例。

验证设计
1.服务器生成验证码异步传输到HTML页面
2.服务器将生成的验证码放入session
3.HTML表单提交
4.后台匹配(将表单值与session值对比)

如图:

Source Code
width = $w;
            $this->height = $h;
            $this->numbers = $n;
            $this->imageType = $imageType;
            $this->codeType = $codeType;

            /*    生成随机的验证字符串    */
            $this->codeString = $this->createCode($this->codeType);
            $this->show();
        }

        private function createCode($type){
            switch($type){
                case 1:
                     /*生成纯数字,首先使用range(0,9)生成数组
                       *通过$this->verifyNums确定字符串的个数
                       *使用array_rand()从数组中随机获取相应个数
                       *使用join将数字拼接成字符串,存储到$this->codeString中
                      */
                    $this->codeString = join("",array_rand(range(0, 9),$this->numbers));
                    break;
                case 2:
                    /*生成纯字母,
                       *小写字母数组range("a","z")
                       *大写字母数组range("A","Z")
                       *合并两个数组array_merge()
                       *更换键和值  array_filp()
                       *随机获取数组中的特定个数的元素 array_rand()
                       *拼接成字符串 implode()
                    */
                    $this->codeString = implode(array_rand(array_filp(array_merge(range("a","z"),range("A","Z"))),$this->numbers));
                case 3:
                    //混合类型
                    $words = str_shuffle("abcdefghjkmpopqrstuvwxyABCDEFGHIJKLMNPQRSTUVWXY3456789");
                    $this->codeString = substr($words,0,$this->numbers);
                    break;
            }
            return $this->codeString;
        }


        //开始准备生成图片
        /*方法名:show()
         *功能  :调用生成图片的所有方法
         */
        private function show(){
            $this->createImg();//创建图片资源
            $this->fillBackground();   //填充背景颜色
            $this->fillPix();  //填充干扰点
            $this->fillArc();  //填充干扰弧线
            $this->writeFont();//写字
            $this->outPutImg();//输出图片
        }
      
        //创建图片资源:imagecreatetruecolor($width,$height)
        private function createImg(){
               $this->resource = imagecreatetruecolor($this->width,$this->height);
         }
      
        //填充背景颜色:imagefill($res,$x,$y,$color)
        //随机生成深色--->imagecolorallocate($res,$r,$g,$b)
        private function setDarkColor()
          {
            return imagecolorallocate($this->resource,mt_rand(130,255),mt_rand(130,255),mt_rand(130,255));
          } 
        //随机生成浅色
        private function setLightColor()
          {
            return imagecolorallocate($this->resource,mt_rand(0,130),mt_rand(0,130),mt_rand(0,130));
          }
        //开始填充
        private function fillBackground()
          {
            imagefill($this->resource,0,0,$this->setDarkColor());
          }
      
        //随机生成干扰点-->imagesetpixel
        private function fillPix()
          {
            //计算产生多少个干扰点(单一像素),这里设置每20个像素产生一个
            $num = ceil(($this->width * $this->height) / 20);
            for($i = 0; $i < $num; $i++){
              imagesetpixel($this->resource,mt_rand(0,$this->width),mt_rand(0,$this->height),$this->setDarkColor());
            }
          }
      
        //随机画10条弧线->imagearc()
        private function fillArc()
          {
            for($i = 0;$i < 10;$i++){
              imagearc($this->resource,
                       mt_rand(10,$this->width-10),
                       mt_rand(5,$this->height-5),
                       mt_rand(0,$this->width),
                       mt_rand(0,$this->height),
                       mt_rand(0,180),
                       mt_rand(181,360),
                       $this->setDarkColor());
            }
          }
      

        /*在画布上写文字
         *根据字符的个数,将画布横向分成相应的块
          $every = ceil($this->width/$this->verifyNums);
         *每一个小块的随机位置画上对应的字符
          imagechar();
         */
        
        private function writeFont()
          {
            $every = ceil($this->width / $this->numbers);
            for($i = 0;$i < $this->numbers;$i++){
              $x = mt_rand(($every * $i) + 5,$every * ($i + 1) - 5);
              $y = mt_rand(5,$this->height - 10);
              
              imagechar($this->resource,6,$x,$y,$this->codeString[$i],$this->setLightColor());
            }
          }
      
        //输出图片资源
        private function outPutImg()
          {
            //header("Content-type:image/图片类型")
            header("Content-type:image/".$this->imageType);
          
            //根据图片类型,调用不同的方法输出图片            
            //imagepng($img)/imagejpg($img)
            $func = "image".$this->imageType;
            $func($this->resource);
          }
      
        //设置验证码字符只能调用,不能修改,用来验证验证码是否输入正确
        public function __get($name){
          if($name = "codeString"){
            return $this->codeString;
          }
        }
        
        //析构方法,自动销毁图片资源
        public function __destruct()
          {
            imagedestroy($this->resource);
          }

    }




//new Code;

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30682.html

相关文章

  • PHP 实现用户注册登录功能

    摘要:本项目发布在实验楼,分为四部分内容前端页面制作,验证码制作,实现注册登陆,功能完善。全部章节及代码详解可以在实验楼中在线完成实现用户注册登录功能验证码制作一实验简介本次实验将会带领大家使用面向对象的思想封装一个验证码类。 项目简介:本课程通过使用 PHP 及 Web 前端技术实现一个网站注册登录入口页面,学习并实践 PHP 编程,GD库,MySQL 扩展,Bootstrap 响应式布局...

    crelaber 评论0 收藏0
  • 小型版php框架

    摘要:项目源码地址链接地址简单版框架特点单入口采用面向对象思想,基于设计思想,使用观察者,注册器,工厂,代理,特性等模式开发。提供一些常用类图片分页文件上传验证码等。提供常用的插件文件压缩合并观察等。基于通过数组下标访问配置文件。 项目源码地址 链接地址(https://github.com/cxp1539/mi... Framework 简单版php框架 Framework特点 单入口i...

    1treeS 评论0 收藏0
  • 【短信服务 USMS】操作指南:国内短信模板管理与发送记录

    摘要:短信模板一短信模板管理在短信服务的国内短信页短信模板页,默认展示当前项目下申请过的各短信模板,主要信息包括短信模板由系统生成的短信模板,当有短信模板相关问题或咨询服务时,您可同时提交该号,将加速处理进展模板类型根据您的短信用途,区分为验证码短信模板一、短信模板管理在短信服务USMS的国内短信页/短信模板Tab页,默认展示当前项目下、申请过的各短信模板,主要信息包括:短信模板ID:由系统生成的...

    Tecode 评论0 收藏0
  • thinkphp实现短信验证注册

    摘要:前言注册时经常需要用到短信验证码,本文记录一下思路和具体实现。短信验证平台使用云片,短信验证码的生成使用。云片发送短信验证码到指定手机号。用户输入短信验证码。 前言 注册时经常需要用到短信验证码,本文记录一下思路和具体实现。短信验证平台使用云片,短信验证码的生成使用thinkphp。 思路 1、用户输入手机号,请求获取短信验证码。2、thinkphp生成短信验证码,存储,同时和其他参数...

    stackfing 评论0 收藏0
  • 【短信服务 USMS】国际短信操作指南:短信模板与发送记录

    摘要:短信模板一短信模板管理在短信服务的国内短信页短信模板页,默认展示当前项目下申请过的各短信模板,主要信息包括短信模板由系统生成的短信模板,当有短信模板相关问题或咨询服务时,您可同时提交该号,将加速处理进展模板类型根据您的短信用途,区分为验证码短信模板一、短信模板管理在短信服务USMS的国内短信页/短信模板Tab页,默认展示当前项目下、申请过的各短信模板,主要信息包括:短信模板ID:由系统生成的...

    Tecode 评论0 收藏0

发表评论

0条评论

Jrain

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<