基于PHP的验证码生成案例

基于PHP的验证码生成案例

PHP 其它杂项

详细介绍

验证码实现案例

参考来源:http://www.imooc.com/video/1679


验证码实现的步骤

  1. 生成底图
  2. 生成验证内容
  3. 生成验证码图片
  4. 效验验证内容

核心功能的技术难点

  • 底图的实现,并添加干扰元素
    • 需要依赖PHP图片处理库GD
  • 生成验证内容
    • 简单的随机数生成,可以使用PHP函数mt_rand()
    • 随机数字 + 字母生成,需要使用ASCII编码理论
    • 随机中文内容生成,需要UTF-8编码理论基础
  • 验证内容保存在服务端
    • 需要PHP操作SESSION
  • 验证内容的效验
    • 需要前台的Ajax效验

开发前的准备

  1. 安装PHP的运行环境
  2. 检测PHP是否支持GD,可以使用phpinfo()查看

实现验证码底图

  • GD可以参考PHP Manual手册
  • 注意事项:
    • 图片底图生成依赖GD扩展
    • 输出图片前,必须提前输出图片head信息
    • 使用imagecreatetruecolor()创建真彩色图像默认背景为黑
  • 参考文件:captcha_randNum.php
  • 参考代码

实现随机数字验证码内容

  • 注意事项:
    • 控制好字体大小和分布情况,避免字体重叠和显示不全
    • 做好字体颜色的变换,可以控制RGB在0-120之内,深色区段
    • 增加干扰元素(点、线),同时要控制好颜色,避免“喧宾夺主”
  • 参考文件:captcha_randNumOrChar.php
  • 参考代码

通过SESSION存储验证信息

  • 注意事项:

    • session_start()必须处于脚本的最顶端
    • 多服务器的情况下,可以采用集中管理SESSION信息
  • 参考文件:captcha_randNumOrCharSession.php

  • 参考代码

      session_start(); //处于最顶部,初始化
      
      $captch_code = "";
      ...
      $captch_code .= $fontcontent; //进行拼接
      ...
      
      $_SESSION["leyiweb"] = $captch_code; //将验证码内存保存到SESSINO
    

验证效验

  • 验证分为三部分
    • 生成验证码以及保存SESSION的PHP文件
    • 前端用户输入界面(引用验证码PHP)
    • 后端效验接口,对SESSION和RESQUEST超全局变量的值进行效验
  • 注意事项:
    • 文件需要引用正确
    • 前端input框的name是用于后端接收的,需要设置好
    • 用户一般输入字符是不分大小写,验证码字典中采用全小写,需要将用户的输入进行大小写转换后进行效验
  • 参考文件:form.php validate.php captcha_randNumOrCharSession.php
  • 参考代码:见源代码文件

动态效验

  • 问题探究:
    • 很多时候机器生产的验证码很难被识别,一般都会设置让用户更换验证码的操作
    • 更换事件是都过js实现的,当图片被点击进行更换验证码的src
    • 为了保证js能够更换验证码的src,验证码的URL设置为http://xx.xxx.xx/x.png?r=rand(),只需更换r的值即可
  • 参考文件:form.php validate.php captcha_randNumOrCharSession.php
  • 参考代码:见源代码文件

复杂验证码的实现

  • 类型:图片、视频验证码
  • 原理:建立物料库 + 对应关系,将之前的随机生成验证内容改为随机选择图片并选择对应的验证信息
  • 参考文件:captcha_randImage.php
  • 参考代码:

中文验证码的实现

  • 实现与之前的类似,核心在替换验证码内容部分为中文
  • 注意事项:
    • GBK编码时,需要将中文通过iconv()转换为UTF-8
    • 选用的TTL文件需要支持中文,TTL文件可以到控制面板底下查找
    • 一个中文汉字在UTF-8下需要占用三个字节
  • 参考文件:form.php validate.php captcha_randZh.php
  • 参考代码:

编辑于2017.8.7

推荐源码