imagestring生成纯数字验证码最简路径无需字体文件,需配对session_start()与header('content-type: image/png'),控制字符集、位置及防缓存;备选base64 svg方案可绕过gd限制。

imagestring 足够快,但必须配对 session_start() 和正确 header,否则浏览器只看到乱码或空白。
用 imagestring 生成纯数字验证码最简路径
不依赖字体文件、不调用 imagettftext,适合无中文字体或 GD 配置受限环境。核心是控制字符集、位置和输出头:
-
rand(0, 9999)生成 0–9999 范围整数,再用str_pad($n, 4, '0', STR_PAD_LEFT)补零成 4 位字符串 - 画布尺寸建议设为
120×40或200×60,太小易重叠,太大浪费带宽 -
imagestring的字体大小参数只能是 1–5(内置位图字体),选5最清晰;x/y 坐标要预留左右边距,比如30, 15 - 必须在
imagepng()前调用header('Content-Type: image/png'),且该行之前不能有任何输出(包括空格、BOM)
$_SESSION 存值时机与常见失效点
验证码值必须在图像输出前写入 $_SESSION,且 session_start() 要放在文件最顶部(不能有空行或 echo)。容易出错的地方:
- 多个 PHP 文件共用 session 时,
session_name()不一致会导致取不到值 - Apache + mod_php 环境下,
session.save_path权限不对会静默失败(查error_log可见 warning) - 前端 img src 指向
captcha.php,但该文件里漏了session_start(),校验端永远读不到$_SESSION['captcha'] - 用户刷新页面后没重新请求
captcha.php,导致 session 值陈旧,而表单提交时比对的是旧值
点击刷新验证码必须加时间戳参数
HTML 中直接写 <img src="captcha.php"> 会导致浏览器缓存图片,点击无效。正确做法是绑定 onclick 并动态更新 src:
- JS 里用
new Date().getTime()或Math.random()生成唯一查询参数,例如captcha.php?t=1724778366123 - PHP 端无需处理该参数,
captcha.php每次被访问都会执行全新逻辑、生成新数字、覆盖 session 值 - 如果用 AJAX 刷新,注意响应类型不是图片,而是 JSON,此时需改用 base64 SVG 方案,否则前端无法直接赋值给
img.src
不依赖 GD 库的备选方案:base64 内联 SVG
当服务器禁用 GD(如某些共享主机),可用纯文本 SVG + base64 绕过绘图限制。虽无干扰线,但满足基础防自动化场景:
- 生成 4 位数字后,拼成 SVG 字符串:
<svg width="120" height="40"><text x="10" y="28" font-size="24">1234</text></svg> - 用
base64_encode()编码后拼成data:image/svg+xml;base64,...数据 URI - 该字符串可直接赋给
<img src="...">,无需额外 HTTP 请求,也不触发 PHP 图像头限制 - 缺点:无法添加噪点/扭曲/干扰线,OCR 识别门槛低;部分老旧 IE 不支持 data URI
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











