PHP实现验证码需动态生成图片并校验,方法包括:一、GD库手动绘图;二、Session存值+内存流输出;三、封装可配置类;四、Base64内联嵌入;五、集成SimpleCaptcha库。

如果需要在PHP网页中实现用户身份验证,防止机器人自动提交表单,则需动态生成包含随机字符的图片验证码。以下是几种可行的操作方法:
一、使用GD库直接绘制验证码图片
该方法通过PHP内置的GD图像处理扩展,手动创建画布、设置字体、绘制背景与干扰元素,并将随机字符串写入图像。要求服务器已启用GD扩展且支持TrueType字体。
1、启用GD扩展:确认php.ini中取消注释extension=gd或extension=php_gd2.dll,并重启Web服务。
2、生成4位随机字符串:使用mt_rand()与str_shuffle()组合生成字母数字混合字符,排除易混淆字符如0、O、l、I。
立即学习“PHP免费学习笔记(深入)”;
3、创建图像资源:调用imagecreate(120, 40)创建宽120px、高40px的画布。
4、分配颜色:使用imagecolorallocate()定义背景色(浅灰)、文字色(深蓝)及干扰线色(浅红)。
5、填充背景:使用imagefilledrectangle()绘制纯色背景矩形。
6、绘制干扰线条:循环调用imageline(),参数使用mt_rand()生成随机起点与终点坐标。
7、写入验证码文本:使用imagettftext()配合绝对路径.ttf字体文件,逐字符定位绘制,x坐标按字符宽度偏移。
8、设置HTTP头并输出图像:header('Content-Type: image/png')后调用imagepng()输出,最后imagedestroy()释放资源。
二、使用Session保存验证码值并输出图像流
该方法将生成的验证码字符串存入$_SESSION,确保后续表单提交时可比对,同时以内存图像流方式输出,避免临时文件写入,提升安全性与效率。
1、开启Session:在脚本开头调用session_start(),确保会话可用。
2、生成6位验证码:使用range()与array_rand()从大小写字母+数字中抽取6个唯一字符,implode()拼接成字符串。
3、存入Session:执行$_SESSION['captcha_code'] = strtolower($code),统一转小写便于校验。
4、创建真彩色图像:调用imagecreatetruecolor(130, 45)获得高质量画布。
5、抗锯齿处理:启用imageantialias($image, true)使文字边缘更平滑。
6、添加噪点:嵌套循环调用imagesetpixel(),以5%概率在随机坐标绘制单像素点。
7、旋转字符:对每个字符单独调用imagettftext(),角度设为mt_rand(-15, 15),x坐标累加字符宽度。
8、输出PNG流:设置header('Content-Type: image/png'),调用imagepng($image, null)直接输出至浏览器。
三、封装为可复用的验证码类
将验证码生成逻辑封装为独立类,支持配置长度、尺寸、字体路径、干扰强度等参数,便于多处调用且降低耦合度。
1、定义CaptchaGenerator类:声明private属性$width、$height、$length、$fontPath、$code。
2、构造函数接收配置数组:使用array_merge()合并默认参数,强制检查$fontPath是否存在且可读。
3、实现generateCode()方法:基于random_int()生成密码学安全随机字符,过滤掉易混淆集。
4、实现createImage()方法:内部调用imagecreatetruecolor()、分配颜色、绘制圆角矩形背景、添加波浪形干扰曲线(imagearc()模拟)。
5、实现output()方法:先调用session_start(),再$_SESSION['captcha'] = $this->code,最后输出图像并exit。
6、在页面中实例化:new CaptchaGenerator(['length' => 5, 'width' => 140])->output();
四、使用Base64编码内联输出验证码
该方法不依赖单独图片请求,将生成的PNG图像编码为Base64字符串,直接嵌入HTML img标签的src属性中,适用于无服务端图片路由的静态环境。
1、创建图像资源后暂存于内存:使用imagepng($image, $output)将图像数据写入变量$output而非文件。
2、编码为Base64:执行$base64 = base64_encode($output)。
3、拼接data URI:构造字符串$dataUri = 'data:image/png;base64,' . $base64。
4、返回JSON响应:设置header('Content-Type: application/json'),输出json_encode(['status' => 'success', 'captcha_img' => $dataUri])。
5、前端AJAX获取:JavaScript调用fetch()获取该接口,解析JSON后设置document.getElementById('captcha').src = data.captcha_img。
6、同步Session值:在返回JSON前仍需执行$_SESSION['captcha_code'] = $code,供后端校验使用。
五、集成SimpleCaptcha第三方库
采用轻量级Composer包simple-captcha,避免重复造轮子,提供预设样式、中文支持及防绕过机制,适合快速集成场景。
1、安装依赖:在项目根目录执行composer require mewebstudio/simple-captcha。
2、引入自动加载:require_once 'vendor/autoload.php';
3、配置参数:新建$config = ['backgrounds' => ['#ffffff'], 'fonts' => ['path/to/arial.ttf'], 'length' => 4];
4、实例化生成器:$captcha = new \Mews\Captcha\CaptchaBuilder($config);
5、生成图像并获取代码:$captcha->build(); $code = $captcha->getPhrase();
6、存储至Session:$_SESSION['captcha_simple'] = $code;
7、输出图像:header('Content-Type: image/jpeg'); $captcha->output();











