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