PHP数字验证码有四种实现方式:一、GD库生成PNG图片;二、base64内联SVG字符串;三、GD加干扰线增强安全;四、API接口返回JSON数据供前端动态显示。

如果您需要在PHP项目中实现用户登录或注册时的简单数字验证码功能,则可以通过生成随机数字并将其绘制为图片来完成。以下是几种不同的实现方法:
一、使用GD库生成纯数字验证码图片
该方法利用PHP内置的GD图像处理扩展,创建一个背景色可调、字体大小适中的PNG格式验证码图片,并将四位纯数字写入其中。验证码数字同时存储于session中供后续校验。
1、开启session并生成4位随机数字:
session_start();
$code = str_pad(rand(0, 9999), 4, '0', STR_PAD_LEFT);
$_SESSION['captcha'] = $code;
2、创建200×60像素的画布:
$image = imagecreate(200, 60);
$bg = imagecolorallocate($image, 240, 240, 240);
立即学习“PHP免费学习笔记(深入)”;
3、分配文字颜色并写入数字:
$text_color = imagecolorallocate($image, 50, 50, 50);
imagestring($image, 5, 50, 20, $code, $text_color);
4、输出PNG图片头信息并显示:
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
二、不依赖GD库的base64内联验证码字符串方案
该方法避开图像生成,直接生成可嵌入HTML img标签的base64编码数字字符串,适用于无GD扩展环境或需快速部署的轻量场景。
1、生成4位数字并转换为base64字符串:
$code = str_pad(rand(0, 9999), 4, '0', STR_PAD_LEFT);
$_SESSION['captcha'] = $code;
$text = "数字:" . $code;
$base64 = 'data:image/svg+xml;base64,' . base64_encode('');
2、在HTML中直接使用该base64字符串:' . $base64 . '" alt="验证码">
三、使用字符干扰线增强基础数字验证码安全性
在GD绘图基础上添加随机线条和噪点,提升OCR识别难度,但保持数字清晰可读,适用于对基础防爬有要求的表单验证场景。
1、创建画布并设定背景色:
$image = imagecreate(200, 60);
$bg = imagecolorallocate($image, 255, 255, 255);
2、生成并写入4位数字:
$code = str_pad(rand(0, 9999), 4, '0', STR_PAD_LEFT);
$_SESSION['captcha'] = $code;
$text_color = imagecolorallocate($image, 0, 0, 0);
imagestring($image, 5, 45, 20, $code, $text_color);
3、绘制5条随机位置干扰线:
for ($i = 0; $i $x1 = rand(0, 200); $y1 = rand(0, 60);
$x2 = rand(0, 200); $y2 = rand(0, 60);
$line_color = imagecolorallocate($image, rand(180, 220), rand(180, 220), rand(180, 220));
imageline($image, $x1, $y1, $x2, $y2, $line_color);
}
4、输出图片:
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
四、基于Session+AJAX的前后端分离验证码校验流程
该方案将验证码生成与校验逻辑解耦,前端通过AJAX请求获取验证码值(非图片),后端将数字存入session并返回JSON响应,适用于Vue/React等单页应用集成。
1、创建captcha_api.php文件,输出JSON格式验证码:
session_start();
$code = str_pad(rand(0, 9999), 4, '0', STR_PAD_LEFT);
$_SESSION['captcha'] = $code;
header('Content-Type: application/json');
echo json_encode(['code' => $code]);
2、前端JavaScript发起GET请求获取验证码:
fetch('captcha_api.php')
.then(r => r.json())
.then(data => {
document.getElementById('captcha-display').textContent = '' + data.code + '';
});
3、表单提交时携带该数字至校验接口:
const input = document.getElementById('user_captcha').value;
if (input === document.getElementById('captcha-display').textContent) {
// 允许提交
}










