PHP验证码类

简介: 分享一个自用的PHP验证码类。

QQ图片20220426170852.png

分享一个自用的PHP验证码类。


PHP这老本行可不能忘。

 

不废话了,下边是验证码类的代码:


class Authnum {
//图片对象、宽度、高度、验证码长度
  private $im;
  private $im_width;
  private $im_height;
  private $len;
//随机字符串、y轴坐标值、随机颜色
  private $randnum;
  private $y;
  private $randcolor;
//背景色的红绿蓝,默认是浅灰色
  public $red=238;
  public $green=238;
  public $blue=238;
  /**
   * 可选设置:验证码类型、干扰点、干扰线、Y轴随机
   * 设为 false 表示不启用
   **/
//默认是大小写数字混合型,1 2 3 分别表示 小写、大写、数字型
  public $ext_num_type='';
  public $ext_pixel = false; //干扰点
  public $ext_line = false; //干扰线
  public $ext_rand_y= true; //Y轴随机
  function __construct ($len=4,$im_width=80,$im_height=25) {
// 验证码长度、图片宽度、高度是实例化类时必需的数据
    $this->len = $len;
    $im_width = $len * 15;
    $this->im_width = $im_width;
    $this->im_height= $im_height;
    $this->im = imagecreate($im_width,$im_height);
  }
// 设置图片背景颜色,默认是浅灰色背景
  function set_bgcolor () {
    imagecolorallocate($this->im,$this->red,$this->green,$this->blue);
  }
// 获得任意位数的随机码
  function get_randnum () {
    $an1 = 'abcdefghijklmnopqrstuvwxyz';
    $an2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $an3 = '0123456789';
    if ($this->ext_num_type == '') $str = $an1.$an2.$an3;
    if ($this->ext_num_type == 1) $str = $an1;
    if ($this->ext_num_type == 2) $str = $an2;
    if ($this->ext_num_type == 3) $str = $an3;
    $randnum = '';
    for ($i = 0; $i < $this->len; $i++) {
      // $randnum .= substr($str,(rand()%(strlen($str))),1);
      $start = rand(1,strlen($str) - 1);
      $randnum .= substr($str,$start,1);
    }
    $this->randnum = $randnum;
    // $_SESSION['an'] = $this->randnum;
  }
// 获得验证码图片Y轴
  function get_y () {
    if ($this->ext_rand_y) $this->y = rand(5, $this->im_height/5);
    else $this->y = $this->im_height / 4 ;
  }
// 获得随机色
  function get_randcolor () {
    $this->randcolor = imagecolorallocate($this->im,rand(0,100),rand(0,150),rand(0,200));
  }
// 添加干扰点
  function set_ext_pixel () {
    if ($this->ext_pixel) {
      for($i = 0; $i < 100; $i++){
        $this->get_randcolor();
        imagesetpixel($this->im, rand()%100, rand()%100, $this->randcolor);
      }
    }
  }
// 添加干扰线
  function set_ext_line () {
    if ($this->ext_line) {
      for($j = 0; $j < 2; $j++){
        $rand_x = rand(2, $this->im_width);
        $rand_y = rand(2, $this->im_height);
        $rand_x2 = rand(2, $this->im_width);
        $rand_y2 = rand(2, $this->im_height);
        $this->get_randcolor();
        imageline($this->im, $rand_x, $rand_y, $rand_x2, $rand_y2, $this->randcolor);
      }
    }
  }
  /**创建验证码图像:
   * 建立画布(__construct函数)
   * 设置画布背景($this->set_bgcolor();)
   * 获取随机字符串($this->get_randnum ();)
   * 文字写到图片上(imagestring函数)
   * 添加干扰点/线($this->set_ext_line(); $this->set_ext_pixel();)
   * 输出图片
   **/
  function create () {
    $this->set_bgcolor();
    $this->get_randnum ();
    for($i = 0; $i < $this->len; $i++){
      $font = rand(4,6);
      $x = $i/$this->len * $this->im_width + rand(1, $this->len);
      $this->get_y();
      $this->get_randcolor();
      imagestring($this->im, $font, $x, $this->y, substr($this->randnum, $i ,1), $this->randcolor);
    }
    $this->set_ext_line();
    $this->set_ext_pixel();
    header("content-type:image/png");
    imagepng($this->im);
    imagedestroy($this->im); //释放图像资源
    return $this->randnum;
  }
}//end class

 

下边是控制器中的调用方法:


/**使用验证码类的方法:
 * $an = new Authnum(验证码长度,图片宽度,图片高度);
 * 实例化时不带参数则默认是四位的60*25尺寸的常规验证码图片
 * 表单页面检测验证码的方法,对比 $_SESSION[an] 是否等于 $_POST[验证码文本框ID]
 * 可选配置:
 * 1.验证码类型:$an->ext_num_type=1; 值为1是小写类型,2是大写类型,3是数字类型
 * 2.干扰点:$an->ext_pixel = false; 值为false表示不添加干扰点
 * 3.干扰线:$an->ext_line = false; 值为false表示不添加干扰线
 * 4.Y轴随机:$an->ext_rand_y = false; 值为false表示不支持图片Y轴随机
 * 5.图片背景:改变 $red $green $blue 三个成员变量的值即可
 **/
$an = new Authnum(4,200,50);
$an->ext_num_type='';
$an->ext_pixel = true; //干扰点
$an->ext_line = false; //干扰线
$an->ext_rand_y= true; //Y轴随机
$an->green = 238;
$an->create();

 

下边是html中显示的方法:


/**
 * 我是前端啊
 */
<body>
 <form action="reg.php" method="post">
  username: <input type="text" name="username"> <br>
  password: <input type="password" name="password"> <br>
  code: <input type="text" onkeyup="if(this.value!=this.value.toUpperCase()) this.value=this.value.toUpperCase()" size="6" name="code">
    <img src="code.php" onclick="this.src='code.php?'+Math.random()" /> <br>
  <input type="submit" name="dosubmit" value="登 录"> <br>
 </form>
</body>


目前在前端框架大量应用的情况下,使用上边这种纯PHP的验证码模式已经非常少了。怎么说呢,我刚刚入行的时候这个玩意用的还是挺多的,这也算是被时代淘汰了吧。  



目录
相关文章
|
7月前
|
Java 程序员 PHP
PHP对象和类
PHP对象和类
59 0
|
2月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP开发领域,设计模式是解决常见问题的高效方案集合。它们不是具体的代码,而是一种编码和设计经验的总结。单例模式作为设计模式中的一种,确保了一个类仅有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的基本概念、实现方式及其在PHP中的应用。
单例模式在PHP中的应用广泛,尤其在处理数据库连接、日志记录等场景时,能显著提高资源利用率和执行效率。本文从单例模式的定义出发,详细解释了其在PHP中的不同实现方法,并探讨了使用单例模式的优势与注意事项。通过对示例代码的分析,读者将能够理解如何在PHP项目中有效应用单例模式。
|
3月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
49 2
|
3月前
|
PHP
PHP中的面向对象编程:理解类与对象
本文将深入探讨PHP中面向对象编程的核心概念——类与对象。通过实例讲解,帮助读者更好地理解如何在PHP中运用OOP编写更高效、可维护的代码。
54 9
|
4月前
|
PHP 开发者
PHP中的面向对象编程:掌握类与对象的精髓
探索PHP的面向对象编程世界,本文将带你了解如何通过创建和操作类来实例化对象。我们将深入讲解类的声明、构造函数的使用以及继承和多态性的概念。准备好,让我们一起在代码的海洋中航行,揭开PHP对象编程的神秘面纱!
|
5月前
|
PHP
如何在PHP中创建一个自定义的观察者类?
【7月更文挑战第2天】如何在PHP中创建一个自定义的观察者类?
30 0
|
5月前
|
PHP
PHP中,你可以使用class关键字来定义一个类
【7月更文挑战第2天】PHP中,你可以使用class关键字来定义一个类
31 0
|
6月前
|
PHP
php生成验证码
php生成验证码
22 0
|
7月前
|
存储 监控 安全
PHP医院安全(不良)事件报告系统源码 vue2+element支持11大类不良事件上报、审核处理、分析改进
医院安全(不良)事件管理系统采用无责的、自愿的填报不良事件方式,有效地减轻医护人员的思想压力,实现以事件为主要对象,可以自动、及时、实际地反应医院的安全、不良、近失事件的情况,更好地掌握不良事件的发生趋势,为及时采取适当的管理措施和流程、制度改进提供了良好的量化依据。系统通过汇集不同类型事件的报告,从中分析出医院内部潜在的问题和风险,将发生的事故降到最低,从而保证病人安全和医护人员安全。
58 0
|
XML 移动开发 Shell
CTF中常用的php原生类总结
CTF中常用的php原生类总结
238 0