PHP图片验证码如何实现?

使用 PHP 类来生成验证码的示例:

class Captcha
{
    protected $width = 100; // 验证码宽度
    protected $height = 30; // 验证码高度
    protected $length = 4; // 验证码长度
    protected $font_size = 16; // 验证码字体大小

    public function generate()
    {
        session_start(); // 启动会话

        // 创建图像对象
        $image = imagecreatetruecolor($this->width, $this->height);

        // 设定背景色
        $bg_color = imagecolorallocate($image, 255, 255, 255);
        imagefill($image, 0, 0, $bg_color);

        // 生成验证码字符串
        $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
        $str = '';
        for ($i = 0; $i < $this->length; $i++) {
            $str .= $chars[mt_rand(0, strlen($chars) - 1)];
        }

        // 把验证码字符串存入会话变量
        $_SESSION['captcha'] = $str;

        // 绘制验证码字符串
        $text_color = imagecolorallocate($image, 0, 0, 0);
        for ($i = 0; $i < $this->length; $i++) {
            $x = ($this->width / $this->length) * $i + ($this->width / $this->length - $this->font_size) / 2;
            $y = $this->height / 2 + $this->font_size / 2 - 2;
            imagettftext($image, $this->font_size, mt_rand(-10, 10), $x, $y, $text_color, __DIR__ . '/arial.ttf', $str[$i]);
        }

        // 输出图像
        header('Content-type: image/png');
        imagepng($image);

        // 释放资源
        imagedestroy($image);
    }

    public function validate($value)
    {
        session_start(); // 启动会话

        if (isset($_SESSION['captcha']) && strtolower($_SESSION['captcha']) === strtolower($value)) {
            unset($_SESSION['captcha']);
            return true;
        } else {
            return false;
        }
    }
}

使用示例:

客户端代码:

<!-- 在 HTML 页面中引用验证码图片 -->
<img src="captcha.php" alt="验证码">
<!-- 提交表单时发送验证码字符串 -->
<input type="text" name="captcha">

服务器端代码:

<?php
// 创建验证码对象
$captcha = new Captcha();

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

// 验证提交的验证码
if ($captcha->validate($_POST['captcha'])) {
    echo '验证通过';
} else {
    echo '验证失败';
}

PS:此代码仅为示例,封装可以更加完善,不建议直接用于生产环境。

© 版权声明
THE END
喜欢就支持一下吧
点赞15
评论 抢沙发

请登录后发表评论

    暂无评论内容