Java面试题学习5 - 接口防刷

一、Redis 限流

以设备号、用户 ID、IP 等维度作为 key,结合 Redis 实现限流。常见有两种方式:

固定窗口 :设置 key 的计数器,每次请求 incr,超过阈值则拒绝,expire 控制窗口时长。实现简单,但存在窗口临界突刺问题(窗口切换瞬间可能放过双倍请求)。

滑动窗口 :用 zset 存储请求时间戳,每次请求时清除窗口外的旧记录,统计窗口内的请求数,更精准但内存消耗略高。

令牌桶 / 漏桶:可借助 Lua 脚本保证原子性,适合需要平滑限流的场景。

多维度组合限流效果更好,比如同一 IP 每分钟不超过 60 次,同一设备号每天不超过 10 次注册。


二、智能风控

在前端采集行为特征,上报风控系统进行评分判断,常见特征包括:

  • 设备指纹:设备号、UA、屏幕分辨率、字体列表等,识别同一设备批量操作
  • 行为轨迹:鼠标移动轨迹、点击速度、滑动加速度,机器行为通常过于规律
  • 账号特征:注册时长、历史登录频率、手机号归属地等
  • 环境检测:是否模拟器、是否开启无障碍服务、是否 root/越狱

风控评分超过阈值后,可分级处置:低风险弹验证码、中风险要求短信验证、高风险直接拦截。


三、通道兜底(网关 / 中间件层)

在流量入口处设置熔断和降级,防止刷量流量穿透到核心服务:

  • 虚拟号码通道:对接运营商或第三方短信通道时,识别虚拟号段(如 170/171 等虚商号段)并单独限流或拦截
  • 熔断降级:通过 Sentinel 或 Hystrix 对注册、发短信等接口设置 QPS 阈值,超过后直接熔断,避免下游服务被打垮
  • 网关层限流:在 API 网关统一拦截,比应用层更靠前,能有效减少无效请求对服务的压力

四、后端定时任务清理

对于已注册但从未真实使用的"僵尸账号"进行定期清理,降低数据库压力和被刷账号池的价值:

  • 注册超过 N 天且从未登录 → 标记为待清理
  • 清理前可发送一次召回通知,给真实用户补救机会
  • 建议软删除(加 deleted 标记)而非直接物理删除,保留一段时间后再彻底清除,防止误删

此外还可以配合手机号黑名单,对已被标记为刷量的号码直接拒绝注册。


补充:其他常见手段

  • 短信验证码频控:同一手机号每天发送上限、同一 IP 每小时发送上限,从源头卡住批量注册
  • 图形验证码 / 滑块:在高风险操作前增加人机验证门槛
  • 手机号实名校验:接入运营商实名核验接口,一个身份证只能注册有限个账号

一句话总结:

防刷是分层防御体系------网关限流拦流量、风控识别拦行为、通道熔断保稳定、定时清理降价值,多层叠加才能有效对抗。