php图片验证码功能需生成4–6位无易混淆字符的随机字符串存入session,用gd库绘制带轻微旋转、偏移及适度干扰线/噪点的图像,前端点击刷新并校验后及时销毁session值。

用PHP实现图片验证码功能,核心是生成随机字符串、绘制到图像上、保存会话并校验。关键不在复杂度,而在安全性和可用性的平衡——比如加干扰线但别影响识别,字符不重复但避免易混淆(如0和O),同时防止直接暴露验证逻辑。
生成随机验证码字符串
先创建4–6位的随机字符串,避开易混淆字符:
- 定义字符集:去掉 0、O、l、I 等视觉相似字符,例如
$chars = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ'; - 用
str_shuffle()或循环mt_rand()拼接,确保每次生成不同且长度固定 - 将生成的字符串存入
$_SESSION['captcha_code'],并设置过期时间(如5分钟)
用GD库绘制带干扰的验证码图
使用PHP内置GD扩展(需启用 extension=gd)绘制图像:
- 创建画布:
$im = imagecreatetruecolor(120, 40);(宽高适中,防拉伸变形) - 分配背景色和文字色,用
imagefilledrectangle()填充底色 - 逐个字符用
imagettftext()绘制,加入轻微旋转(±5°)和X/Y方向随机偏移,增强抗OCR能力 - 添加2–3条干扰线(
imageline())和若干噪点(imagesetpixel()),但密度控制在不影响人眼识别的程度 - 输出前加响应头:
header('Content-Type: image/png');,再用imagepng($im)输出,最后imagedestroy($im)
前端嵌入与表单校验配合
验证码不是孤立图片,要和表单流程打通:
- HTML中用
<img src="captcha.php?r=<?=%20time()%20?>" alt="验证码" onclick="this.src='captcha.php?r='+Math.random()">实现点击刷新(加时间戳或随机数防缓存) - 表单提交时,把用户输入的验证码值(如
$_POST['captcha'])与$_SESSION['captcha_code']不区分大小写比对(strtolower()) - 校验后立即清空 session 中的验证码(
unset($_SESSION['captcha_code'])),防止重放 - 失败时返回错误提示,并可自动刷新验证码图片(前端JS触发)
基础安全与可维护提醒
简单功能也需注意边界问题:
- 开启 session 前不能有任何输出(检查BOM、空格、echo);建议在脚本开头加
session_start(); - 验证码接口(如 captcha.php)应禁止直接GET参数操控内容,不接受
?font=xxx这类可被利用的参数 - 生产环境建议限制同一IP单位时间内的请求频次(可用 Redis 计数),防暴力刷图
- 若GD不可用,可考虑用 imagick 扩展替代,或退化为纯文本验证码(仅调试用)
不复杂但容易忽略细节。只要字符生成可靠、图像干扰适度、会话绑定清晰、前后端交互闭环,一个轻量又实用的验证码就完成了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











