你有没有遇到过这样的情况:刚上线一个限时抢购接口,不到两分钟就被脚本扫光库存;或者注册页面一开放,后台瞬间冒出几百个手机号,全是虚拟号段+随机昵称。这不是运气差,是缺了靠谱的防刷验证机制。
防刷不是加个验证码就完事
很多开发者第一反应是「上滑动验证码」或「点选文字」,但实际中,这类图形验证早被 OCR + 模型识别批量破解。更常见的是,攻击者用真实手机+自动化工具模拟点击,验证码形同虚设。真正有效的防刷,得从请求源头、行为路径、设备指纹多个维度卡住。
轻量级实战方案:时间窗 + 请求指纹
比如登录接口,不单校验账号密码,还记录 IP + User-Agent + 设备 ID(可用 localStorage 或 fingerprintjs 生成)的组合,在 Redis 中存最近 5 分钟内该指纹的请求次数。超过 3 次就触发二次验证:
if (requestCount > 3) {
return { code: 429, msg: '请完成人机验证', needCaptcha: true };
}
关键点在于:指纹不能只依赖 IP(NAT 环境下千人一IP),也不能只靠前端传参(可伪造),最好服务端结合 TLS 握手信息、HTTP/2 header 顺序等隐性特征做辅助判断。
别让「验证」变成用户体验断点
某次帮朋友优化活动页,把「每次提交都弹验证码」改成「首次异常行为触发,且仅对高风险操作(如领券、抽奖)生效」,转化率回升了 27%。防刷的目标不是挡住所有人,而是让机器难、让人轻松——比如允许正常用户连续点击 5 次不拦,但第 6 次突然间隔 0.1 秒,就值得怀疑。
工具推荐:几款真正在用的开源组件
Cloudflare 的 Turnstile 已经替代 reCAPTCHA v2/v3,无需用户交互,纯 JS SDK 埋点,后端调用 verify 接口即可解密 token;国内可试腾讯防水墙,支持行为分析+设备画像,接入时只需替换前端 script 和后端校验逻辑,对老项目侵入极小。
顺便提一句:别在本地开发环境关掉所有验证然后上线——测试时用 mock 数据跑通不等于线上扛得住真实流量。建议用 Locust 写个简单压测脚本,模拟 50 个并发用户高频点击,看看风控策略是否如期触发。