codeigniter 验证码功能在 ci3 和 ci4 中差异显著:ci3 依赖原生 create_captcha() 及 captcha_helper,需 gd 库、正确配置 img_path/img_url、数据库防重放及中文扩展;ci4 彻底移除原生支持,须用 gregwar/captcha 等第三方库或自实现,并强调时效控制、一次性消费与客户端特征绑定。

CodeIgniter 的验证码功能在不同版本中差异明显,核心在于 CI3 用原生辅助函数 create_captcha(),CI4 则完全移除该功能、需第三方扩展或自实现。配置方式、依赖条件和安全逻辑也完全不同。
CI3 的验证码配置(原生支持)
CI3 内置 captcha_helper,但不是“装上就能用”,必须满足四个硬性前提:
-
GD 图像库必须启用:运行
extension_loaded('gd')返回true;Docker 环境常需手动安装php-gd并重启 PHP-FPM -
img_path和img_url必须同时正确设置:img_path是服务器绝对路径(如APPPATH . '../captcha/'),目录要存在且 Web 进程可写(755 或 777);img_url是对应可访问的 URL(如base_url() . 'captcha/'),二者必须映射一致,否则图片 404 -
验证逻辑不能只比 session 值:原生返回的
word存 session 易被重放。推荐用数据库表(如captcha)存word、captcha_time、ip_address,验证时加时间判断(如WHERE word = ? AND captcha_time > UNIX_TIMESTAMP() - 300)并立即删除记录 -
中文需自定义类:原生
create_captcha()不支持中文字符;需新建application/libraries/Captcha.php,加载中文字体(如fonts/zhttfs/msyh.ttf),重写绘图逻辑
CI4 的验证码处理(无原生模块)
CI4 官方彻底移除了 captcha_helper 和 create_captcha()。所有验证码都需自行实现或引入第三方包:
-
推荐方案:使用
pragmarx/google2fa或robthree/twofactorauth——适用于 TOTP 类型,适合登录二次验证,不适用于表单图形验证码 -
图形验证码常用做法:用
gregwar/captchaComposer 包(轻量、支持中文、无需 GD 强依赖);安装后在控制器中调用:$captcha = new \Gregwar\Captcha\CaptchaBuilder(); $captcha->build(); $_SESSION['captcha'] = $captcha->getPhrase();,再输出图片或 base64 -
自建简易方案:用 PHP 内置
image*函数(需 GD)生成 PNG,结合 session 存 phrase;注意设置session_regenerate_id(true)防会话固定,并添加 IP + 时间戳限制防刷
跨版本通用安全要点
无论 CI3 还是 CI4,只要涉及图形验证码,以下三点不能跳过:
-
时效控制必须由业务层实现:CI3 的
expiration参数只管图片文件自动清理,不影响验证逻辑;CI4 更需手动在验证前检查当前时间与生成时间差是否超限(如 5 分钟) - 验证后必须一次性消费:比对成功即销毁存储(session 或 DB 记录),避免同一验证码多次提交
- 建议绑定客户端特征:除 IP 外,可哈希 User-Agent 或加 token 字段,降低共享 session 或代理穿透风险











