扩展库

多个模块发布

图片验证码

功能说明

绘制图片验证码,用于登录、注册等场景的人机校验。绘制需要 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 同样可用。

配置项

属性默认值说明
$codelen5字符个数(构造函数第 1 参)
$width120画布宽(第 2 参)
$height30画布高(第 3 参)
$fontsizenull字号;null = 按画布高度与单格宽度自动推算
$fontnull字体绝对路径;null = 用同目录的 captcha.ttf
$charset54 个字符候选字符集,已剔除 i l o I L O 0 1 等易混字符
$sessionKey'captcha'会话键名。同站多个验证码(登录、注册)各用一个
$expire300有效期(秒);0 = 不过期
$maxAttempts5同一张图的最大尝试次数;0 = 不限。达到即作废,强制换图
$caseSensitivefalse是否区分大小写

策略属性在出图时一并写进会话,随这张验证码一起走,所以校验侧不必再配一遍,只要键名保持一致:

$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作废并失败
比对成功立即作废,同一张验证码不可重放 → 成功
比对失败次数加一;达到上限则作废(强制换图),否则保留让用户重新输入
下载类库 (大小:13k)(更新时间:2026-09-24 11:10:01)