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

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

让我详细讲解一下“一个经典的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验证码类分享

基础教程推荐