PHP GD库生成简易验证码代码示例

程一诺
程一诺
发布时间:2026-10-13 | 5人浏览过
原创

本文介绍如何利用PHP内置的GD库快速生成一个基础的随机字符验证码。代码涵盖画布创建、背景与噪点绘制、文字渲染及图像输出全过程,适合初学者了解GD库绘图原理或用于简单场景的快速部署。

功能目标

生成一张包含5位十六进制随机字符的图片,并叠加随机噪点和干扰线以提升基础识别难度,最终以JPEG格式返回给浏览器。

准备条件

  1. 环境要求:服务器上必须启用并加载PHP的GD扩展(可通过 phpinfo() 确认是否有 "gd" 模块)。
  2. 权限配置:确保PHP进程对Web根目录或指定临时文件夹拥有读写权限(若需保存文件至磁盘,本例为直接输出到浏览器则仅需执行权限)。

真实操作顺序

第1步:初始化画布与背景

目的:创建指定宽高的图像资源对象,并填充黑色背景。

  • 入口:imagecreatetruecolor(宽度, 高度) 与 imagecolorallocate()。
  • 动作:
    • 创建尺寸为用户自定义的画布(示例中为100x30像素)。
    • 分配第一个颜色通常作为背景色。在GD库中,背景色需在后续绘制前定义。

第2步:生成随机字符

目的:构建待显示在验证码中的字符串内容。

  • 入口:rand() 与 dechex()。
  • 动作:
    • 循环5次,每次生成1-15之间的随机整数。
    • 将其转换为十六进制字符串(对应字符0-9和A-F)。
    • 拼接成最终的5位验证码文本 $rand。

第3步:绘制噪点与干扰元素

目的:增加机器自动识别的难度,防止简单的OCR破解。

  • 入口:imagesetpixel() 与 imageline()。
  • 参数逻辑:
    • 噪点:在画布范围内随机位置绘制散点,颜色RGB值也在0-255间随机分配。
    • 干扰线:使用 imageline 在画布上绘制一条斜线,坐标和颜色同样随机化,以破坏字符边缘的连贯性。

第4步:输出验证图片

目的:将内存中的图像资源转换为标准图像格式并发送给前端。

  • 入口:header() 与 imagejpeg()。
  • 动作:
    • 设置HTTP头 Content-type:image/jpeg,告知浏览器解析为图片而非HTML。
    • 调用 imagejpeg($im) 将图像资源推送到输出缓冲区。

第5步:完整参考代码

以下代码整合了上述步骤,包含必要的注释说明。请注意,原始草稿中的循环条件存在笔误(如 $i<0;),已修正为正确的递增逻辑以确保功能正常运行。

// 1. 生成随机字符串(5位十六进制)
$rand = '';
for($i=0;$i<5;$i++){
    $rand .= dechex(rand(1,15)); // 生成数字0-15对应的hex字符
}

// 2. 创建画布
$im = imagecreatetruecolor(100, 30);

// 3. 分配颜色
$bg = imagecolorallocate($im, 0, 0, 0); // 背景黑
$color_font = imagecolorallocate($im, rand(88, 255), rand(88, 255), rand(100, 255)); // 字体颜色偏亮
$color_line = imagecolorallocate($im, rand(0, 255), rand(0, 255), rand(0, 255)); // 线条颜色随机

// 4. 绘制噪点 (修复原代码中循环条件错误)
for($i=0;$i<100;$i++){
    $color_dian = imagecolorallocate($im, rand(0,255), rand(0,255), rand(0,255));
    imagesetpixel($im, rand()%100, rand()%30, $color_dian);
}

// 5. 绘制干扰线
imageline($im, rand(1,10), rand(5,13), rand(80,100), rand(5,15), $color_line);

// 6. 写入文字
// 参数:画板, 字体大小(1-5), x起始, y起始, 文字, 颜色
imagestring($im, 5, rand(4, 60), rand(3, 10), $rand, $color_font);

// 7. 输出图像
header("Content-type: image/jpeg");
imagejpeg($im); 

// 可选:销毁资源释放内存(虽然脚本结束会自动清理)
imagedestroy($im); 

完成判断

将上述代码保存为 captcha.php 并在服务器端运行。当请求该页面时,浏览器应直接显示一张包含5个随机十六进制字符及杂乱点的JPEG图片,而不显示任何文本代码或报错信息。

简要总结

此方案利用PHP原生GD函数实现了轻量级的验证码生成。由于未引入外部字体文件或复杂加密算法,安全性有限,仅适用于对抗普通自动化脚本的基础防护。如需更高安全性,建议结合会话(Session)存储验证码值并进行后端校验,或使用更复杂的数学运算/混淆算法。

以上就是基于PHP生成简单验证码的详细内容,更多关于PHP图形处理与安全防护的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表