CodeIgniter 的 create_captcha() 需满足四大前提:GD 库启用、img_path 与 img_url 可写可访问、验证逻辑含时效与防重放、中文需自定义类支持。

create_captcha() 是 CodeIgniter 原生验证码功能的入口,但它不是开箱即用的“一键生成”函数——你必须先满足三个硬性前提,否则会直接报错或返回空。
GD 库未启用或缺失时 create_captcha() 会静默失败
create_captcha() 会静默失败create_captcha() 依赖 GD 图像库生成 PNG 图片。如果服务器没装 GD,或 PHP 编译时禁用了 GD,函数不会抛异常,而是返回空数组(['image' => '', 'word' => '']),前端只看到空白 <img alt="CodeIgniter框架验证码怎么生成_CodeIgniter框架安全验证码调用详解【详解】" > 标签。
- 检查方法:运行
phpinfo(),搜索 “gd” 看是否启用;或执行extension_loaded('gd')。 - 常见坑:Docker 镜像(如
php:8.2-cli)默认不带 GD,需手动安装libgd-dev+php-gd并重启 PHP-FPM。 - 替代方案:不依赖 GD 的纯文本验证码(如存入 session)可绕过此限制,但失去图像防自动化能力。
img_path 和 img_url 必须同时可写且可访问
img_path 和 img_url 必须同时可写且可访问这两个参数不是可选的——即使你只打算用 word 做 session 验证,create_captcha() 内部仍会尝试写入图片文件。
-
img_path是服务器绝对路径(如'./captcha/'),该目录必须:- 存在(CI 不自动创建)
- 权限为 755 或 777(Web 进程用户可写)
-
img_url是浏览器能访问的 URL 路径(如base_url()."/captcha/"),必须与img_path映射一致,否则<img src="..." alt="CodeIgniter框架验证码怎么生成_CodeIgniter框架安全验证码调用详解【详解】" >404。 - 常见错误:把
img_path写成'application/captcha/'——这个路径在 Web 根目录外,无法通过 URL 访问,导致图片加载失败。
验证逻辑不能只比对 $_POST['word'] 和 session 中的值
$_POST['word'] 和 session 中的值很多教程直接把 create_captcha() 返回的 word 存进 session,提交时直接比对。这存在两个风险:
- session 可被劫持或共享(尤其多服务器部署时)
- 没有过期控制:同一个 word 可重复提交多次
更稳妥的做法是:
- 使用数据库表(如
captcha表)存储word、captcha_time、ip_address - 查询时加条件:
WHERE word = ? AND captcha_time > UNIX_TIMESTAMP() - expiration - 验证成功后立即
DELETE该记录,防止重放
expiration 参数单位是秒,但注意:它只控制图片文件保留时间,不控制验证逻辑的时效性——这个逻辑必须你自己实现。
中文验证码需自定义类,原生 create_captcha() 不支持
create_captcha() 不支持CI 自带的 create_captcha() 只支持 ASCII 字符(pool 参数里填中文会乱码或报错)。要显示中文,必须:
- 新建一个类(如
application/libraries/Captcha.php) - 手动调用
imagettftext()+ 指定 .ttf 字体路径 - 在
pool中传入 UTF-8 编码的中文字符串(需确保字体支持该字形) - 注意 PHP 版本兼容性:
imagettftext()在 PHP 8.1+ 对字体路径更严格,建议用realpath()处理
最易忽略的一点:中文字符宽度不一,固定 imagestring() 位置会重叠,必须按字符逐个计算 x 坐标。
create_captcha() 看似简单,但每个参数背后都绑着服务器配置、路径权限、时序安全和字符编码四类问题。跳过任一环节,验证码就只是个摆设。


















