优先选 gregwar/captcha:轻量、php 7.4+ 兼容好,laravel 新项目推荐;mews/captcha 仅适合 laravel 8 及以下,但维护滞后;切勿误用 intervention/image 或 ocr 工具替代验证码方案。

怎么选对验证码插件(Laravel 场景最常见)
Composer 本身不提供验证码功能,所谓“安装验证码插件”,实际是引入第三方包,比如 gregwar/captcha 或 mews/captcha。前者更轻量、无框架耦合;后者专为 Laravel 封装,自带路由和 Facade,但 Laravel 9+ 后维护变慢,容易报 Class 'Mews\Captcha\CaptchaServiceProvider' not found。
- 新项目优先试
gregwar/captcha:纯 PHP 实现,PHP 7.4+ 兼容好,composer require gregwar/captcha即可 - Laravel 8 及以下用
mews/captcha可省点胶水代码,但得手动加CaptchaServiceProvider到config/app.php - 别装
intervention/image单独来画验证码——它只是图像处理库,不是验证码方案,装了也白装
装完为什么生成不了图片?常见路径和权限坑
装完包不等于能用,gregwar/captcha 默认把临时图片存在 web/cache 目录,而 Laravel 的 public 目录下往往没这个子目录,或 webserver 没写权限,结果返回空白或 500。
- 手动创建
public/cache目录,并确保 webserver 用户(如 www-data)有写权限:chmod 755 public/cache - 改缓存路径更稳妥:在生成时传参,比如
CaptchaBuilder::create()->setOutPath('/tmp/captcha')->save('key') - Apache 下如果启用了
mod_security,可能拦截含captcha字样的响应,错误日志里会出现ModSecurity: Access denied,临时关掉规则或加白名单
怎么在表单里正确集成(避免 CSRF 和刷新失效)
验证码值必须和服务端 session 绑定,否则前端换图、后端校验就对不上。很多人直接用 JS 随便 reload <img src="/captcha" alt="composer怎么安装验证码插件_composer怎么配置图形识别【入门】" >,但没同步更新隐藏域里的 token,导致每次校验都失败。
- 服务端生成时,把验证码 key 存进 session:
$_SESSION['captcha_key'] = $key(原生 PHP)或session(['captcha_key' => $key])(Laravel) - 前端换图时,必须同时请求新 key:
fetch('/captcha/reload').then(r => r.json()).then(data => { img.src = data.img; input.value = data.key }) - 校验前先检查 session 中的 key 是否存在且未过期,
gregwar/captcha默认有效期 300 秒,超时后check()直接返回 false
图形识别配置根本不存在——别被标题误导
Composer 安装的都是「生成」验证码的库,不是「识别」的。所谓“图形识别配置”,其实是 OCR 工具(如 Tesseract)的事,和验证码插件无关。强行让 PHP 调用 tesseract 去识别自己刚生成的图,既没必要,又绕远路,还极容易因字体/噪点/扭曲导致识别率低于 60%。
- 如果你真在做自动化测试,需要绕过验证码,直接 mock session 中的验证值,而不是调 OCR
- 生产环境绝对不要暴露识别接口,
POST /recognize-captcha这种路由等于给爬虫送钥匙 - 有些教程让你配
php-ocr扩展,那是个早已归档的废弃项目,GitHub 上最后更新是 2015 年
真正卡住人的,从来不是“怎么装”,而是“怎么让生成、传输、校验三步串起来还不被缓存/跨域/权限打断”。每个环节漏一个点,页面就只显示一个空盒子。










