PHP 实现动态生成图片验证码系统(支持不同复杂度)

验证码(CAPTCHA)广泛应用于防止恶意机器人自动提交表单、执行登录等操作。虽然大多数开发者会使用现成的验证码服务或者简单的图形验证码生成,但在一些特定场景下,开发者可能需要实现一个可自定义的、复杂度较高的验证码生成系统,支持动态调整验证码的复杂度、字体、背景、干扰线等。
本示例演示了如何在 PHP 中实现一个灵活的动态生成验证码的功能,并且支持高自定义,包括:

1.支持数字、字母、混合验证码;
2.动态设置验证码复杂度;
3.添加干扰线、干扰点等图像效果;
4.可自定义字体、颜色和背景。

功能概述

5.验证码内容生成:可以选择生成纯数字、纯字母、数字字母混合的验证码。
6.验证码图像样式:动态设置图像大小、背景颜色、文字颜色、字体等。
7.干扰元素:支持添加干扰线、干扰点来增强验证码的复杂度。
8.过期机制:验证码会生成并存储到会话中,验证时会比较用户输入的验证码与生成的验证码是否一致。

代码实现
1. PHP 代码:动态生成图片验证码
<?php

session_start();

// 配置验证码设置
$captchaConfig = [
    'width' => 150,      // 图像宽度
    'height' => 50,      // 图像高度
    'length' => 5,       // 验证码长度
    'fontSize' => 20,    // 字体大小
    'fontFile' => 'path/to/font.ttf', // 自定义字体路径
    'bgColor' => [220, 220, 220],    // 背景颜色(RGB)
    'textColor' => [0, 0, 0],       // 字体颜色(RGB)
    'lineNoise' => 3,    // 干扰线数量
    'pointNoise' => 100, // 干扰点数量
    'codeType' => 'alphanumeric' // 验证码类型:'numeric', 'alphabet', 'alphanumeric'
];

// 随机生成验证码内容
function generateCaptchaCode($length, $type) {
    $characters = '';
    if ($type == 'numeric') {
        $characters = '0123456789';
    } elseif ($type == 'alphabet') {
        $characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    } elseif ($type == 'alphanumeric') {
        $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    }

    $captchaCode = '';
    for ($i = 0; $i < $length; $i++) {
        $captchaCode .= $characters[mt_rand(0, strlen($characters) - 1)];
    }
    return $captchaCode;
}

// 创建验证码图片
function createCaptchaImage($captchaCode, $config) {
    // 创建画布
    $image = imagecreatetruecolor($config['width'], $config['height']);

    // 设置背景颜色
    $bgColor = imagecolorallocate($image, $config['bgColor'][0], $config['bgColor'][1], $config['bgColor'][2]);
    imagefill($image, 0, 0, $bgColor);

    // 设置字体颜色
    $textColor = imagecolorallocate($image, $config['textColor'][0], $config['textColor'][1], $config['textColor'][2]);

    // 设置验证码字体
    $font = $config['fontFile'];
    $fontSize = $config['fontSize'];

    // 在图像上绘制验证码文字
    $textBox = imagettfbbox($fontSize, 0, $font, $captchaCode);
    $textWidth = $textBox[2] - $textBox[0];
    $textHeight = $textBox[7] - $textBox[1];
    $x = ($config['width'] - $textWidth) / 2;
    $y = ($config['height'] - $textHeight) / 2 + $textHeight;

    // 绘制文字
    imagettftext($image, $fontSize, 0, $x, $y, $textColor, $font, $captchaCode);

    // 添加干扰元素:干扰线
    for ($i = 0; $i < $config['lineNoise']; $i++) {
        $lineColor = imagecolorallocate($image, mt_rand(100, 255), mt_rand(100, 255), mt_rand(100, 255));
        imageline($image, mt_rand(0, $config['width']), mt_rand(0, $config['height']), mt_rand(0, $config['width']), mt_rand(0, $config['height']), $lineColor);
    }

    // 添加干扰元素:干扰点
    for ($i = 0; $i < $config['pointNoise']; $i++) {
        $pointColor = imagecolorallocate($image, mt_rand(100, 255), mt_rand(100, 255), mt_rand(100, 255));
        imagesetpixel($image, mt_rand(0, $config['width']), mt_rand(0, $config['height']), $pointColor);
    }

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

    // 释放内存
    imagedestroy($image);
}

// 生成验证码并保存到 session
$captchaCode = generateCaptchaCode($captchaConfig['length'], $captchaConfig['codeType']);
$_SESSION['captcha_code'] = $captchaCode;

// 创建验证码图片
createCaptchaImage($captchaCode, $captchaConfig);

?>

2. 使用说明

9.环境要求:


10.本代码需要 PHP 环境支持 GD 库,这是一个图形处理库,用于生成验证码图像。你可以通过以下命令检查是否已经安装:
 bash
 php -m | grep gd

 如果没有安装 GD 库,可以通过包管理器安装:
11.对于 Ubuntu/Debian 系统:
bash
sudo apt-get install php-gd

12.对于 CentOS 系统:
bash
sudo yum install php-gd

13.配置:


14.在代码顶部,有一个 $captchaConfig 配置数组,你可以根据需求自定义验证码的生成设置:
15.width 和 height:设置验证码图片的宽度和高度;
16.length:设置验证码字符的长度;
17.fontSize:设置验证码字符的字体大小;
18.fontFile:设置字体文件路径(必须提供真实的字体路径,.ttf 格式的字体文件)。
19.bgColor:设置背景颜色;
20.textColor:设置文字颜色;
21.lineNoise 和 pointNoise:分别设置干扰线和干扰点的数量;
22.codeType:设置验证码类型,支持 'numeric'(数字)、'alphabet'(字母)、'alphanumeric'(数字和字母混合)。


23.验证码生成:


24.使用 generateCaptchaCode() 函数生成一个随机的验证码内容。根据 codeType 的配置,可以生成纯数字、字母或者数字字母混合的验证码。
25.生成的验证码会被保存在 PHP 的 $_SESSION 中,用户在表单中输入验证码时,可以与该值进行比对。


26.验证码图片输出:


27.使用 createCaptchaImage() 函数将验证码内容绘制到图像上,并加入背景颜色、文字颜色、干扰线、干扰点等效果。
28.最终,PHP 会输出一个 PNG 格式的验证码图像。


29.表单验证:


30.在用户提交验证码时,可以将输入的验证码与 $_SESSION['captcha_code'] 中存储的验证码进行比对,验证是否正确。


31.例子:如何使用此验证码生成器:


32.在 HTML 页面中通过 src 属性引入 PHP 脚本,生成验证码图像:
 html
 <img src="captcha.php" alt="CAPTCHA" />

33.在表单提交时,进行验证码验证:
 php
 if ($_POST['captcha_input'] == $_SESSION['captcha_code']) {
     echo "验证码正确!";
 } else {
     echo "验证码错误,请重新输入。";
 }


3. 注意事项

34.安全性:


35.虽然本示例提供了验证码生成和验证的功能,但验证码的复杂度仍然有限,恶意机器人可能通过图像识别技术破解简单的验证码。为了增强安全性,可以结合其他验证手段(如图像识别难度更高的验证码、短信验证等)。


36.字体文件:


37.确保字体文件的路径正确,否则验证码生成时会出错。推荐使用常见的 .ttf 字体文件,例如 arial.ttf。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值