一个简单安全的PHP验证码类 附调用方法

yizhihongxing

让我来为您详细讲解一个简单安全的PHP验证码类,同时附上调用方法。

什么是验证码

验证码通常是一种用于验证用户身份的安全技术。主要应用在网络应用程序中,用于防止恶意的自动机器人的恶意攻击,以及保护网站用户的隐私。

简单安全的PHP验证码类

下面是一个简单安全的PHP验证码类的代码示例:

<?php
namespace App\Code;

class Captcha
{
    protected $width;
    protected $height;
    protected $code_num;
    protected $code;
    protected $img;

    public function __construct($width = 100, $height = 30, $code_num = 4)
    {
        $this->width = $width;
        $this->height = $height;
        $this->code_num = $code_num;
        $this->code = $this->generateCode();
    }

    public function generateCode()
    {
        $char_pool = "ABCDEFGHJKLMNOPQRSTUVWXYZ23456789";
        $code = '';
        for ($i = 0; $i < $this->code_num; $i++) {
            $code .= $char_pool[mt_rand(0, strlen($char_pool) - 1)];
        }
        return $code;
    }

    public function generateCaptcha()
    {
        $this->img = imagecreate($this->width, $this->height);
        $bg_color = imagecolorallocate($this->img, 240, 240, 240);
        $text_color = imagecolorallocate($this->img, 0, 0, 0);

        for ($i = 0; $i < 15; $i++) {
            $x1 = mt_rand(0, $this->width);
            $y1 = mt_rand(0, $this->height);
            $x2 = mt_rand(0, $this->width);
            $y2 = mt_rand(0, $this->height);
            imageline($this->img, $x1, $y1, $x2, $y2, imagecolorallocate($this->img, mt_rand(0, 200), mt_rand(0, 200), mt_rand(0, 200)));
        }

        $font = __DIR__ . '/../../fonts/Lato-Regular.ttf';
        $font_size = $this->height / 1.5;
        $text_box = imagettfbbox($font_size, 0, $font, $this->code);
        $x = ($this->width - ($text_box[2] - $text_box[0])) / 2;
        $y = ($this->height - ($text_box[1] - $text_box[7])) / 2;
        imagettftext($this->img, $font_size, 0, $x, $y, $text_color, $font, $this->code);
    }

    public function getCode()
    {
        return $this->code;
    }

    public function display()
    {
        header("Content-Type:image/png");
        imagepng($this->img);
    }

    public function saveImage($path)
    {
        imagepng($this->img, $path);
    }

    public function __destruct()
    {
        imagedestroy($this->img);
    }
}

这个类包含 __construct() 构造函数,用于设置验证码的宽度,高度和验证码长度。generateCode() 生成一个随机的验证码字符串。 generateCaptcha() 创建一个图像,并在该图像中生成验证码。getCode() 返回当前验证码字符串。display()saveImage() 用于输出或保存验证码图像。__destruct() 销毁验证码图像。

在该类中,使用 imagecreate() 创建一个图像对象,并通过 $bg_color$text_color 变量设置颜色。使用 imageline() 创建干扰线,使用 imagettfbbox()imagettftext() 将验证码文本添加到图像中。

调用方法

要使用这个验证码类,您需要在项目中加载这个类。下面是一个简单的示例:

// 引入验证码类库
require_once('vendor/autoload.php');

use App\Code\Captcha;

// 初始化验证码
$captcha = new Captcha();

// 生成验证码
$captcha->generateCaptcha();

// 获取验证码字符串
$code = $captcha->getCode();

// 输出验证码图像
$captcha->display();

在这个例子中,我们首先使用 require_once() 函数引入验证码类库。然后,我们使用 Captcha() 构造函数初始化验证码对象。接下来,使用 generateCaptcha() 生成验证码图像,并通过 getCode() 获取验证码字符串。最后,我们可以使用 display() 输出验证码图像,也可以使用 saveImage() 保存验证码图像到文件系统中。

示例说明

以下是使用上述验证码类的两个示例:

示例一:基于Web的验证码

假设您正在开发一个Web应用程序,并希望通过在登录页面上添加验证码,为您的用户提供更加安全的登录方式。下面是一个基于Web的示例代码,使用上述验证码类:

// 引入验证码类库
require_once('vendor/autoload.php');

use App\Code\Captcha;
session_start();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $captcha = new Captcha();
    $captcha->generateCaptcha();
    $_SESSION['captcha_code'] = $captcha->getCode();
    $captcha->display();
    exit;
}

if (isset($_POST['login']) && isset($_POST['captcha'])) {
    if ($_POST['captcha'] !== $_SESSION['captcha_code']) {
        echo '验证码不正确!';
        exit;
    }
    // 验证通过,进行用户登录
}

在这个例子中,当用户提交登录表单时,我们生成一个新的验证码,并将验证码字符串保存在使用 session_start() 命令开启的会话中。我们检查用户输入的验证码是否与会话中保存的验证码相同。如果验证码正确,则登录操作继续,否则显示错误消息。

示例二:邮件验证码

另一个用例是发送验证码的电子邮件。下面是使用上述验证码类实现邮件验证码的示例代码:

// 引入验证码类库
require_once('vendor/autoload.php');

use App\Code\Captcha;

// 初始化验证码
$captcha = new Captcha();

// 生成验证码
$captcha->generateCaptcha();

// 获取验证码字符串
$code = $captcha->getCode();

// 发送验证码到用户邮箱
$message = '您的验证码是:'. $code;
mail('user@example.com', '验证码', $message);

在这个例子中,我们首先初始化验证码对象,并使用 $captcha->generateCaptcha() 生成一个验证码图像。然后,使用 $captcha->getCode() 获取验证码字符串,并将它包含到信息中发送到用户的邮箱。邮件服务之间的具体实现可能会有所不同,但基本原理是相同的。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一个简单安全的PHP验证码类 附调用方法 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 用PHP将网址字符串转换成超链接(网址或email)

    当我们在发表文章或者留言时,常常需要将输入的链接字符串转化为可供用户点击的链接,这就需要使用PHP将网址字符串转换为超链接。 以下是使用PHP进行网址字符串转换的完整攻略: 使用正则表达式匹配网址字符串 使用preg_match()函数和正则表达式来匹配网址字符串,找到所有符合要求的字符串。 $regex = "/(http|https|ftp|f…

    PHP 2023年5月26日
    00
  • 用PHP编写和读取XML的几种方式

    当需要处理和传输数据时,XML是一种常用的数据格式。PHP为处理XML数据提供了多种方式。以下是几种使用PHP编写和读取XML文件的方法: 1. 使用SimpleXML SimpleXML 是一种在 PHP 5 及以上版本中自带的解析 XML 文件的 API。它可以将 XML 文件转换为对象,便于读取和处理。使用SimpleXML的步骤如下: a. 加载XM…

    PHP 2023年5月26日
    00
  • php输出形式实例整理

    PHP输出形式实例整理攻略 简介 PHP是一门被广泛应用的Web开发语言。在PHP中,通常需要将处理结果输出到网页上供用户查看。本文将通过对PHP输出形式的整理和实例说明,帮助读者进一步了解如何在PHP中输出内容。 一、echo命令 在PHP中,可以使用echo命令输出字符串、数字和变量等内容。echo的语法非常简单,只需要在命令后面跟上要输出的内容即可。 …

    PHP 2023年5月26日
    00
  • 浅谈PHP设计模式的装饰器模式

    简介 装饰器模式又叫做装饰者模式,属于结构型的设计模式。指的是在不改变原类文件和使用继承的情况下动态扩展这个对象的功能,从而修饰源数据。组成:抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责。抽象装饰(Decorator)角色:继承…

    PHP 2023年4月19日
    00
  • 骁龙8gen2和骁龙888性能相差多大 骁龙8gen2和骁龙888对比详解

    骁龙8gen2和骁龙888性能对比 近年来,手机处理器的高速发展使得消费者对高性能处理器的需求越来越大。目前市面上较为知名的处理器品牌为高通,其骁龙系列处理器备受用户青睐。其中骁龙8gen2和骁龙888都是其较为出色的产品。那么,骁龙8gen2和骁龙888的性能相差多大呢?接下来我们将对两者的性能进行详细对比分析。 骁龙8gen2和骁龙888的处理器架构 首…

    PHP 2023年5月27日
    00
  • php计算多个集合的笛卡尔积实例详解

    PHP计算多个集合的笛卡尔积实例详解 什么是笛卡尔积 笛卡尔积,又称直积,是在数学中用于组合两个集合的方法。笛卡尔积的结果是一个新的集合,该集合中的每个元素都是由两个原始集合中的一个元素组成的有序对。 举一个简单的例子:假设有两个集合,分别为A={a,b,c}和B={x,y},则A和B的笛卡尔积为: A × B = {(a,x),(a,y),(b,x),(b…

    PHP 2023年5月26日
    00
  • 简单的PHP缓存设计实现代码

    下面是详细的“简单的PHP缓存设计实现代码”的完整攻略。 缓存的定义及作用 缓存是一种提高访问速度的技术,它通过将数据保存在系统中,使得后续访问同样的数据时,可以直接从缓存中获取,而无需再次去请求原始数据,从而提高访问速度。 在网站开发中,缓存的应用非常广泛,可以用于缓存查询结果、模板缓存、静态资源等等。对于一些访问频率较高,但是数据又不会频繁更新的内容,使…

    PHP 2023年5月27日
    00
  • 实例讲解PHP设计模式编程中的简单工厂模式

    下面是关于“实例讲解PHP设计模式编程中的简单工厂模式”的完整攻略: 1. 简单工厂模式的概念 简单工厂模式(Simple Factory Pattern)是一种常用的工厂模式,又叫静态工厂方法模式(Static Factory Method Pattern)。 简单工厂模式的作用是根据不同的参数,返回不同类的实例。这样可以把对象的创建和客户代码的调用分离开…

    PHP 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部