Laravel 12.x 本身不内置图形验证码功能,所谓“验证码绕过漏洞”源于第三方组件(如mews/captcha)集成时的服务端校验缺失、状态未失效或客户端信任问题;修复核心是强制服务端一次性实时比对、立即失效缓存token、绑定会话ID防冒用,并配合限流与严格中间件校验。

Laravel 12.x 本身不内置图形验证码(CAPTCHA)功能,因此所谓“验证码绕过漏洞”并非框架原生问题,而是开发者自行集成第三方验证码组件(如 mews/captcha、anerg/captcha 或自研实现)时引入的安全缺陷。修复关键在于补全验证逻辑闭环,杜绝服务端校验缺失、状态重放或客户端信任。
以下为生产环境推荐的修复路径:
✅ 强制服务端一次性校验
验证码必须在提交时由服务端实时比对,并立即失效:
- 用户请求验证码 → 后端生成随机字符串 + 加密 token(如
hash_hmac('sha256', $code, config('app.key'))),存入缓存(Redis)并设置 2 分钟 TTL; - 前端提交表单时,必须同时携带
captcha_token和用户输入的captcha_value; - 后端收到后:
- 先查缓存是否存在该
captcha_token; - 若存在,取出原始验证码值,严格区分大小写比对(避免
strtoupper()类型弱比较); -
比对成功后立刻
Cache::forget($token),确保不可重放; - 比对失败或 token 不存在,直接返回 422 并拒绝后续逻辑。
- 先查缓存是否存在该
✅ 防止 token 泄露与复用
-
captcha_token不应通过 URL 传递(易被日志/代理记录),必须走 POST body 或加密 header; - 禁用浏览器自动填充验证码字段(
<input autocomplete="off" ...>仅辅助,需配合服务端强制校验); - 避免将原始验证码明文写入 HTML 或 JS 变量(常见于前端渲染错误示例)。
✅ 绑定上下文防跨用户冒用
- 生成 token 时,将当前会话 ID 或用户 IP(经哈希脱敏)混入签名:
$token = hash_hmac('sha256', $code . session_id(), config('app.key')); - 校验时同步验证 session_id 是否匹配,防止 A 用户获取的 token 被 B 用户复用。
✅ 补充基础防护层
- 对验证码接口
/captcha/{id}启用限流(如throttle:5,1),防暴力穷举; - 登录/注册等敏感路由必须校验
captcha_token,且不能跳过中间件(检查是否误配except列表); - 若使用 Redis 缓存,确保其访问受控(禁止公网暴露,启用密码认证)。
修复后务必验证:
- 提交正确验证码后,二次提交同一 token 应失败;
- 修改前端隐藏域中的
captcha_value,服务端应拒绝; - 清除 Cookie 后未重新获取新验证码即提交,应报错而非静默通过。
本质上,验证码只是增加自动化攻击成本的辅助手段,核心仍是服务端校验的完整性与原子性。


















