滑动验证码必须由后端校验token,前端仅负责交互;极验v4需用lot_number、passtime、gen_time和动态签名调用verify接口,腾讯密钥须存环境变量,且需解析risk_level/evil_level做风控决策。

滑动验证码不是前端动画,后端必须校验 token
很多人把滑动验证码当成纯前端交互,拖完就放行——这是最大误区。geetest 或 tcaptcha 的核心安全逻辑在服务端:前端拿到的 captcha_ticket、randstr、session_id 必须连同用户行为一起发到你自己的 PHP 接口,再由你用密钥向极验/腾讯服务器发起二次验证。跳过这步等于没加验证码。
实操建议:
- 前端提交表单时,把
geetest_challenge、geetest_validate、geetest_seccode(极验)或ticket、randstr(腾讯)一并 POST 到你的 PHP 验证接口 - PHP 接口收到后,**不直接返回成功**,而是用
file_get_contents或cURL向https://api.geetest.com/ajax.php(极验)或https://ssl.captcha.qq.com/ticket/verify(腾讯)发起请求 - 极验需传
gt、challenge、validate、seccode和你自己的private_key;腾讯需传aid、AppSecretKey、Ticket、Randstr、UserIP
极验 v4 与 v3 的 PHP 验证方式完全不同
极验官网默认推 v4(gt4),但很多老项目还在用 v3。v4 不再返回 challenge/validate 三元组,而是用 lot_number + passtime + gen_time + sign 组合,且签名密钥是动态生成的。直接套 v3 的 PHP 示例会一直返回 fail。
常见错误现象:{"success":0,"message":"invalid lot_number"} 或 {"result":"error","reason":"invalid sign"}
立即学习“PHP免费学习笔记(深入)”;
实操建议:
- v4 验证必须调用
https://gcaptcha4.geetest.com/verify,不能复用 v3 的ajax.php地址 - POST 参数中
lot_number、passtime、gen_time必须原样透传,sign是服务端用private_key对前三者拼接后 HMAC-SHA256 签名(不是前端算的) - 别信网上那些“改个 URL 就能从 v3 升 v4”的代码片段——签名逻辑变了,必须重写验证函数
腾讯防水墙的 AppSecretKey 不能硬编码在 PHP 里
AppSecretKey 相当于腾讯侧的 API 密钥,一旦泄露,攻击者可伪造任意用户的验证结果。PHP 文件若被意外暴露(如配置错误导致 .php 源码可下载),密钥就直接裸奔。
使用场景:本地开发测试时图省事写死在 config.php 里,上线后忘了移除
实操建议:
- 把
AppSecretKey存在 Web 服务器环境变量中(如 Apache 的SetEnv TCAPTCHA_SECRET "xxx",Nginx 配合 php-fpm 的env[TCAPTCHA_SECRET]) - PHP 中统一用
$_SERVER['TCAPTCHA_SECRET']读取,绝不出现"your_secret_key_here"这类字符串 - 验证失败时,腾讯返回的
{"response":"1","err_msg":"invalid request"}很可能是密钥为空或格式错误,先检查var_dump($_SERVER['TCAPTCHA_SECRET'])
滑动通过 ≠ 用户可信,要结合业务做二次判断
极验和腾讯都提供「行为分」或「风险等级」字段(如极验的 risk_level,腾讯的 evil_level),但多数 PHP 集成代码只看 success:1 就放行。实际上,success:1 只代表“人形操作概率高”,不代表没机器人——它可能是个训练有素的自动化脚本。
性能影响:额外解析 JSON 字段几乎无开销,但忽略它们会让风控形同虚设
实操建议:
- 极验 v4 返回的
data.risk_level为"high"时,可拒绝登录、要求短信二次验证,或记录日志人工复核 - 腾讯返回的
evil_level是 0–100 数值,建议 >60 时拦截,>30 时增加滑动难度(如换图、加轨迹校验) - 不要只依赖一次滑动结果——对高频注册/登录 IP,叠加
$_SERVER['HTTP_USER_AGENT']和$_SERVER['REMOTE_ADDR']做简单频控
滑动验证码的真正复杂点不在拖拽动画,而在服务端验证链路是否闭环、密钥是否隔离、风险信号是否被消费。漏掉任意一环,防的只是手动慢速试探,不是真实攻击流量。



















