一个简单安全的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中有很多分页函数,本文将介绍一个功能强大的PHP分页函数。该分页函数支持多种分页样式,灵活配置,易于使用。 安装和引用 下载并解压分页函数代码包到web目录。 在需要使用分页功能的页面开头引用分页函数文件,可以使用require或include方法引用。 示例代码: <?p…

    PHP 2023年5月26日
    00
  • php中使用array_filter()函数过滤数组实例讲解

    现在我来为你详细讲解“php中使用array_filter()函数过滤数组实例讲解”的完整攻略: 1. array_filter()函数是什么? array_filter()函数是PHP中常用的一个数组处理函数,其作用是根据指定的回调函数过滤数组中的元素并返回过滤后的新数组。 2. array_filter()函数的语法 array array_filter…

    PHP 2023年5月26日
    00
  • echo, print, printf 和 sprintf 区别

    当我们需要将变量或文本输出到屏幕或文件时,通常会用到一些输出函数,如 echo、print、printf 和 sprintf。这些函数在PHP中都是用来输出字符串的,在使用中我们经常会混淆它们的使用,下面就详细讲解一下它们之间的区别。 echo echo是PHP中最常用的一个输出函数,它可以直接将字符串、变量输出到浏览器或其他输出设备上,输出结果没有返回值,…

    PHP 2023年5月26日
    00
  • Thinkphp微信公众号支付接口

    请看下面的”ThinkPHP微信公众号支付接口完整攻略”: 1. 前言 微信公众号支付,是指用户在微信公众号中完成整个支付的过程,微信公众号支付的好处是用户不需要离开微信的环境就可以完成支付,使用户跨入购买行动的门槛更低,也使商家更方便地与用户进行交互。 本攻略主要介绍如何在 ThinkPHP 框架中,快速使用微信公众号支付接口。 2. 准备工作 首先,我们…

    PHP 2023年5月23日
    00
  • PHP采集相关教程之一 CURL函数库

    下面我将为你详细讲解“PHP采集相关教程之一 CURL函数库”的完整攻略。 什么是CURL函数库? CURL是一个开源的用于传输数据的库,支持FTP、HTTP、HTTPS、Gopher、Telnet等许多协议,常用于爬虫、接口请求等网络数据传输场景。 CURL在PHP中是通过CURL函数库来实现的,使用CURL可以方便地进行HTTP请求与响应的处理。 CUR…

    PHP 2023年5月27日
    00
  • php输出echo、print、print_r、printf、sprintf、var_dump的区别比较

    PHP是一种非常常用的服务器端编程语言,输出是其最常用的功能之一。在PHP中,常见的输出函数包括:echo、print、print_r、printf、sprintf和var_dump。接下来,我们来一一讲解这些函数的区别比较。 echo echo函数是PHP中最常用的输出函数之一,用于向浏览器输出文本信息。它的语法非常简单,可以输出一个或多个字符串,也可以输…

    PHP 2023年5月26日
    00
  • 微信小程序实现Session功能及无法获取session问题的解决方法

    下面我将为大家详细讲解“微信小程序实现Session功能及无法获取session问题的解决方法”的完整攻略。 什么是Session 在Web应用中,Session是一种记录服务器和客户端会话状态的机制。通过在服务器端存储用户的会话状态,可以实现跨页面的数据传递。微信小程序由于采用了Webview技术,所以也可以使用Session来记录用户的状态,实现状态共享…

    PHP 2023年5月23日
    00
  • VB怎么加密压缩包rar解密程序?

    首先,我们需要了解以下几个概念和技术: 加密和解密:加密是将明文转换为密文,解密是将密文转换为明文。 压缩和解压缩:压缩是将文件或文件夹通过一定算法转换为较小的文件,而解压缩是将压缩后的文件恢复为原始文件或文件夹。 VB语言:Visual Basic(VB)是一种以基于事件驱动的编程为基础的,面向对象的计算机程序设计语言。 下面提供一种示例方式实现VB加密压…

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