多个模块发布
功能说明
绘制图片验证码,用于登录、注册等场景的人机校验。绘制需要 GD 扩展且带 FreeType 支持(imagettftext),校验只用 Session,不依赖 Cookie。
本类库已内置到框架:自 3.1.9 起,图片验证码作为官方扩展随框架分发,位于 extend/captcha/,无需再下载本页的类库包。完整文档(配置项、校验语义、字体授权)见 《类库包》。

出图
控制器里 new 一个实例并调用 output(),它会自己带上 Content-Type: image/png 与 no-store 系列响应头。
public function yzm()
{
(new \extend\captcha\Captcha(4, 120, 30))->output();
}页面调用
因为响应头已禁止缓存,页面里直接引用地址即可,不需要再拼随机数:
<img src="/home/yzm/index" alt="验证码">注意把地址换成你自己的验证码地址。
校验
check() 是一次性的:校验通过立即作废,同一张验证码不可重放;失败会累加尝试次数,达到上限自动作废(强制换图)。
if (!\extend\captcha\Captcha::check(input('yzm'))) {
// 验证码不正确
}需要单独拿图片(存文件、塞进 Response)时用 render(),它只返回 PNG 二进制、不发响应头;code() 读出当前验证码原文。
接进数据验证
function/captcha.php 提供了全局函数 captcha(),可直接当验证规则名用,核心代码零改动:
$v = new Validator();
$v->setRules(['yzm' => 'required|captcha']);
if (!$v->validate(input())) {
// 失败
}
// 需要自定义错误文案时用双反引号
$v->setRules(['yzm' => 'required|captcha``验证码不正确``']);模型的声明式 $rules 同样可用。
配置项
| 属性 | 默认值 | 说明 |
|---|---|---|
$codelen | 5 | 字符个数(构造函数第 1 参) |
$width | 120 | 画布宽(第 2 参) |
$height | 30 | 画布高(第 3 参) |
$fontsize | null | 字号;null = 按画布高度与单格宽度自动推算 |
$font | null | 字体绝对路径;null = 用同目录的 captcha.ttf |
$charset | 54 个字符 | 候选字符集,已剔除 i l o I L O 0 1 等易混字符 |
$sessionKey | 'captcha' | 会话键名。同站多个验证码(登录、注册)各用一个 |
$expire | 300 | 有效期(秒);0 = 不过期 |
$maxAttempts | 5 | 同一张图的最大尝试次数;0 = 不限。达到即作废,强制换图 |
$caseSensitive | false | 是否区分大小写 |
策略属性在出图时一并写进会话,随这张验证码一起走,所以校验侧不必再配一遍,只要键名保持一致:
$c = new \extend\captcha\Captcha(4, 120, 30);
$c->sessionKey = 'login_captcha';
$c->expire = 120;
$c->maxAttempts = 3;
$c->output();
// 校验侧键名保持一致
\extend\captcha\Captcha::check(input('yzm'), 'login_captcha');校验语义
| 情形 | 结果 |
|---|---|
| 会话里没有记录(从未出图 / 已经用过 / 已作废) | 失败 |
超过 $expire | 作废并失败 |
尝试次数已达 $maxAttempts | 作废并失败 |
| 比对成功 | 立即作废,同一张验证码不可重放 → 成功 |
| 比对失败 | 次数加一;达到上限则作废(强制换图),否则保留让用户重新输入 |