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

让我来为您详细讲解一个简单安全的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多个字符串替换成同一个的解决方法

    当需要将多个不同的字符串替换成同一个字符串时,可以使用PHP中的str_replace()函数来实现。 str_replace()函数的第一个参数是待替换的字符串或字符串数组,第二个参数是用来替换的字符串或字符串数组,第三个参数是待替换的原字符串或字符串数组。 以数组为示例,需要将数组中的多个字符串替换成同一个字符串,可以使用以下代码: $originalA…

    PHP 2023年5月26日
    00
  • php自动获取字符串编码函数mb_detect_encoding

    下面是关于”php自动获取字符串编码函数mb_detect_encoding”的完整攻略。 1. mb_detect_encoding函数概述 mb_detect_encoding 函数是PHP中用于自动检测字符串编码的函数,可以用来检测 UTF-8、GB2312、GBK、BIG5 等常见编码方式的字符串,从而准确地将其转换为目标编码方式。 该函数的语法为:…

    PHP 2023年5月26日
    00
  • PHP函数in_array()使用详解

    PHP函数in_array()使用详解 什么是in_array()函数? in_array()函数是PHP中的一个内置函数,用于判断指定的数值、字符串、数组等元素是否存在于数组中。如果存在,则返回 true,否则返回 false。 其语法如下: bool in_array ( mixed $needle , array $haystack [, bool $…

    PHP 2023年5月26日
    00
  • golang与php实现计算两个经纬度之间距离的方法

    当我们需要计算两个经纬度之间的距离时,有多种编程语言和算法可以选择,其中Go和PHP都提供了比较简便的方法,下面我会详细讲解它们的实现方法。 Go语言实现 Go语言没有提供直接计算经纬度距离的函数,但它有一个内置的 math 包,提供了一个函数 math.Sin(),可以帮助我们计算一个角度的正弦值,而这个值可以根据地球半径和纬度差、经度差来计算出两点之间的…

    PHP 2023年5月26日
    00
  • php实现多维数组中每个单元值(数字)翻倍的方法

    要实现多维数组中的每个单元值(数字)翻倍,可以使用PHP中的循环结构和数组操作函数来完成。以下是实现的完整攻略。 步骤一:定义一个多维数组 首先,需要定义一个多维数组,例如: $array = array( array(1, 2, 3), array(4, 5, 6), array(7, 8, 9) ); 上面的代码定义了一个三行三列的二维数组,每个元素都是…

    PHP 2023年5月26日
    00
  • PHP与Web页面交互例子的实现

    下面是 “PHP与Web页面交互例子的实现”的完整攻略: 1. 准备工作 在演示示例之前,我们需要准备好以下工具和环境: 一个Web服务器:用于运行PHP服务,并把结果返回给客户端; 一个文本编辑器:用于编写PHP代码; 一个Web浏览器:用于访问运行在Web服务器上的PHP服务,并查看结果。 2. PHP与Web页面交互的基本概念 在Web开发中,PHP与…

    PHP 2023年5月23日
    00
  • php实现查询功能(数据访问)

    这里我为大家详细讲解一下 PHP 实现查询功能(数据访问)的攻略。在进行操作之前,您需要确保您的 PHP 环境已经搭建好,并且您已经连接并能成功访问您的数据库。 1. 用 PDO (PHP 数据对象)实现查询功能 首先,我们需要新建一个 PHP 文件,比如 query.php,然后在其中添加以下代码: <?php $dsn = ‘mysql:host=…

    PHP 2023年5月23日
    00
  • PHP中魔术变量__METHOD__与__FUNCTION__的区别

    __METHOD__与__FUNCTION__的定义 在 PHP 中,METHOD 和 FUNCTION 都是魔术变量。它们是特殊的常量,用于返回当前方法或函数的名称。魔术常量是在使用它们时自动定义的,无需声明,也无法被重新定义。 METHOD 可以用于类中,返回当前类的方法名称。FUNCTION 可以用于类和函数中,返回当前函数或方法的名称。 使用__ME…

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