一个经典的PHP验证码类分享

yizhihongxing

让我详细讲解一下“一个经典的PHP验证码类分享”的完整攻略。

简介

在网站开发过程中,为了防止恶意的机器人或爬虫攻击,我们常常需要使用验证码来进行验证。本文将分享一个基于PHP的验证码类的实现方式,这个验证码类可以生成包含数字和字母的图片,有效地进行验证。

代码实现

步骤一:基础设置

在生成验证码图像之前,我们需要先基于PHP代码进行一些设置,例如生成一个随机字符串并使用某个字体。

<?php
class Captcha{
    //定义图像的宽度、高度和生成的验证码长度
    private $width = 150;
    private $height = 40;
    private $length = 4;
    //定义字体的路径
    private $font = './Roboto/Roboto-Bold.ttf';

    public function generate() {
        //生成随机字符串
        $randStr = substr(sha1(mt_rand()), 17, $this->length);
        //保存随机字符串,便于后续验证
        $_SESSION['captcha'] = $randStr;
        //创建图像并设定背景色
        $image = imagecreatetruecolor($this->width, $this->height);
        $bgColor = imagecolorallocate($image, 235, 236, 237);
        imagefill($image, 0, 0, $bgColor);
    }
}
?>

步骤二:绘制字符和干扰线

有了基础设置之后,我们就可以进行字符的绘制和干扰线的绘制了。在字符的绘制中,我们需要指定字体文件及字符颜色,然后随机生成每个字符的位置进行绘制。在干扰线的绘制中,我们可以先生成一些随机的线条位置和颜色,然后使用imageline函数进行绘制。

<?php
class Captcha{
    //...

    public function generate() {
        //...

        //定义字符的颜色和绘制位置
        $textColor = imagecolorallocate($image, 0, 0, 0);
        $startX = ($this->width - 20 * $this->length) / 2;
        $startY = ($this->height - 30) / 2;

        //生成字符并进行绘制
        for($i = 0; $i < $this->length; $i++) {
            $char = substr($randStr, $i, 1);
            $x = $startX + $i * 20 + mt_rand(-5, 5);
            $y = $startY + mt_rand(-5, 5);
            imagettftext($image, 20, mt_rand(-20, 20), $x, $y, $textColor, $this->font, $char);
        }

        //定义干扰线的颜色和长度,进行绘制
        for($i = 0; $i < 5; $i++) {
            $lineColor = imagecolorallocate($image, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
            $startX = mt_rand(0, $this->width);
            $startY = mt_rand(0, $this->height);
            $endX = mt_rand(0, $this->width);
            $endY = mt_rand(0, $this->height);
            imageline($image, $startX, $startY, $endX, $endY, $lineColor);
        }

        //输出图像并销毁
        header('Content-Type: image/png');
        imagepng($image);
        imagedestroy($image);
    }
}
?>

步骤三:进行验证

生成验证码图片并输出之后,我们需要进行验证码的验证,保证用户输入的验证码和生成的验证码字符串一致。我们可以在表单中增加一个验证码输入框,用户提交表单时,将用户输入的验证码和之前保存在SESSION中的值进行比对。

<?php
session_start();
if(isset($_SESSION['captcha']) && !empty($_SESSION['captcha'])) {
    if($_SESSION['captcha'] == $_POST['captcha']) {
        // 验证通过
    } else {
        // 验证失败
    }
} else {
    // 未生成验证码
}
?>

示例说明:

示例一

在用户登录页面中添加验证码,使用上述验证码类进行验证码生成,并验证用户输入的验证码是否正确。如果验证码错误,需要给用户相应的提示信息。

<?php
session_start();
$captcha = new Captcha();
$captcha->generate();
?>
<form method="post" action="login.php">
    <label for="username">用户名:</label>
    <input type="text" name="username" id="username"><br>
    <label for="password">密码:</label>
    <input type="password" name="password" id="password"><br>
    <label for="captcha">验证码:</label>
    <input type="text" name="captcha" id="captcha"><br>
    <img src="captcha.php" alt="验证码"><br>
    <input type="submit" value="登录">
</form>

<?php
if(isset($_POST['username']) && isset($_POST['password']) && isset($_POST['captcha'])) {
    if($_POST['captcha'] == $_SESSION['captcha']) {
        // 验证通过,进行登录验证
    } else {
        echo "验证码错误,请重新输入";
    }
}
?>

示例二

在注册页面中添加验证码,同样使用上述验证码类进行验证码生成,并保存用户的注册信息。如果用户输入的验证码错误,需要给出相应提示信息,不允许注册。如果用户输入的验证码正确,将用户信息保存到数据库中,并给出相应的成功提示信息。

<?php
session_start();
$captcha = new Captcha();
$captcha->generate();
?>
<form method="post" action="register.php">
    <label for="username">用户名:</label>
    <input type="text" name="username" id="username"><br>
    <label for="password">密码:</label>
    <input type="password" name="password" id="password"><br>
    <label for="repeatpassword">再次输入密码:</label>
    <input type="password" name="repeatpassword" id="repeatpassword"><br>
    <label for="email">电子邮箱:</label>
    <input type="text" name="email" id="email"><br>
    <label for="captcha">验证码:</label>
    <input type="text" name="captcha" id="captcha"><br>
    <img src="captcha.php" alt="验证码"><br>
    <input type="submit" value="注册">
</form>

<?php
if(isset($_POST['username']) && isset($_POST['password']) && isset($_POST['repeatpassword']) && isset($_POST['email']) && isset($_POST['captcha'])) {
    if($_POST['captcha'] == $_SESSION['captcha']) {
        // 验证通过,将用户信息保存到数据库中
    } else {
        echo "验证码错误,请重新输入";
    }
}
?>

这就是一个基于PHP的验证码类的实现方式,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一个经典的PHP验证码类分享 - Python技术站

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

相关文章

  • php三维数组去重(示例代码)

    关于“php三维数组去重(示例代码)”,我来给你详细讲解一下。 什么是三维数组? 在 PHP 中,数组是一种非常常用的数据结构,它可以把一组数据存储在同一个变量中。而二维数组是指数组里元素本身也是数组,也就是一个二维的表格。同理,我们把二维数组里的每一个元素都再次视为数组,那么这个数组就成了一个三维数组。 三维数组去重 假设现在我们有一个三维数组,其中包含了…

    PHP 2023年5月26日
    00
  • PHP 获取远程网页内容的代码(fopen,curl已测)

    针对“PHP 获取远程网页内容的代码(fopen,curl已测)”这个话题,以下是详细的攻略: 使用 fopen 函数获取远程网页内容 要使用 fopen 函数获取远程网页内容,需要对服务器的 php.ini 文件做相应的配置:将 allow_url_fopen 选项设置为 On。如果服务器没有设置,可以使用以下代码手动设置: ini_set(‘allow_…

    PHP 2023年5月24日
    00
  • php strstr查找字符串中是否包含某些字符的查找函数

    strstr() 函数用于查找字符串中是否包含某些字符,并返回第一个匹配的位置。该函数包含两个参数:要查找的字符(needle)和要被查找的字符串(haystack)。如果找到了匹配的字符,则该函数返回第一次出现该字符的位置。否则,该函数返回 false。 以下是使用 strstr() 函数的一些常见用途: 检查字符串中是否包含某个特定的单词或字符 示例代码…

    PHP 2023年5月26日
    00
  • PHP实现通过二维数组键值获取一维键名操作示例

    下面是详细讲解“PHP实现通过二维数组键值获取一维键名操作示例”的完整攻略: 前置知识 在了解如何通过二维数组键值获取一维键名之前,需要首先掌握以下知识: PHP中的数组(Array):数组是一种用于存储数据的变量类型,常用于存储一组有序的数据。 数组的键和值:在PHP中,数组的每个元素都有一个键和一个值,其中键用于访问数组中的元素,值则是存储在数组中的数据…

    PHP 2023年5月26日
    00
  • 中国式家长全学习类安排增加属性一览

    中国式家长全学习类安排增加属性一览 作为家长,为了让孩子能取得好成绩,很多人都喜欢安排各种各样的学习类活动。这些活动不仅考验了孩子的学习能力,也考验了家长的管理能力。为了帮助家长更好地进行管理,我们在学习类活动中增加了属性系统,在此提供完整攻略。 1. 学习类活动 学习类活动是指与学习相关的活动,比如补习班、培训机构等。在进行学习类活动时,我们可以根据不同的…

    PHP 2023年5月26日
    00
  • PHP Pipeline 实现中间件的示例代码

    下面是详细的 PHP Pipeline 实现中间件的示例代码攻略: 一、概述 PHP Pipeline 是一种将多个中间件按顺序连接起来执行的机制,可以用于处理 HTTP 请求、消息队列、定时任务等多种应用场景。其中,中间件是指用于处理请求或响应的处理函数,可以通过代码实现对请求或响应进行验证、修改、记录日志等操作。 PHP Pipeline 实现中间件的示…

    PHP 2023年5月27日
    00
  • PHP实现懒加载的方法

    下面是详细讲解“PHP实现懒加载的方法”的完整攻略: 什么是懒加载? 懒加载也叫延迟加载,指的是在需要使用某些资源时才加载,而不是一次性加载所有资源。这种方法可以提高网站或应用的性能和响应速度。 PHP实现懒加载的方法 方法一:使用SplAutoloadRegister函数 使用 SplAutoloadRegister 函数可以实现懒加载。通过在类的加载过程…

    PHP 2023年5月27日
    00
  • php中输出json对象的值(实现方法)

    在 PHP 中,可以使用 json_encode() 函数将数组或对象转换为 JSON 格式的字符串。而输出 JSON 对象的值可以通过将 JSON 格式字符串转换为 PHP 对象或数组,然后使用对象或数组中的属性或键值来获取值。 以下是输出 JSON 对象的值的实现方法: 1. 将 JSON 格式字符串转换为 PHP 对象 首先,使用 json_decod…

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