接口防刷/防爬虫?

juming
juming 初级会员超兽战士
发布于 2026-10-08 03:49 ·2 浏览 ·0 回复

接口防刷防爬的本质不是"把所有爬虫挡在门外",而是用"网关限流 + 业务风控 + 分级挑战"三层防线,把异常调用的成本抬到不划算、把正常用户的误伤压到接近零。落地顺序建议固定为:先限流保命,再识别打标,最后才做惩罚和封禁——顺序反了,你会在上线第一天收到一堆"无故被封"的投诉。

接口防刷和防爬虫有什么区别?

结论:防刷针对"高频恶意调用",防爬针对"批量数据抓取",两者目标不同但共用同一套基础设施(限流、指纹、风控规则、验证码),不需要建两套系统。

防刷的典型特征是集中在秒级窗口、单账号或单 IP 高频,比如登录接口被撞库、领券接口被脚本刷。它的核心指标是 QPS 峰值和成功率异常。

防爬的典型特征是低频分散、多 IP、长时间持续:单个 IP 每分钟只请求 3 次,但用 500 个代理 IP 跑一整夜。这类流量在网关层的限流阈值内完全"合法",只能靠行为特征和资源维度计数识别。

所以网关限流能挡住 80% 的粗暴刷接口,但挡不住精细化爬虫——那部分要靠后面的风控层。

限流怎么做?给出可直接抄的参数

结论:限流必须分三层,且优先级是"用户 ID > 设备 ID > IP",只按 IP 限流是新手最容易犯的错。

三层结构:

  1. 网关层(粗粒度、兜底):单 IP 对 /api/login 限制 10 次/分钟,单接口全局上限 5000 QPS,超限返回 HTTP 429 并带 Retry-After: 60,同时在响应头输出 X-RateLimit-Remaining。
  2. 应用层(用户维度):单用户 60 次/分钟,写操作(下单、评论、发帖)单独收紧到 10 次/分钟。
  3. 业务层(资源维度):同一优惠券每人限领 1 张,同一手机号每天最多发 5 条验证码。

算法选择上,固定窗口计数有临界问题:两个相邻窗口的边界处,0:59 打 100 次、1:00 又打 100 次,等于 2 秒内放行 200 次。生产环境用滑动窗口或令牌桶,令牌桶还能顺便支持突发流量(桶容量 20,填充速率 10/秒)。

为什么不能只按 IP 限流?因为 NAT 出口被成百上千人共享,一个写字楼或校园网的出口 IP 可能对应 3000 个真实用户,限死 IP 等于限死整个公司。IP 只作为兜底和"无登录态接口"的临时维度。

怎么识别请求是机器还是人?

结论:单看 QPS 会被绕过,真正有效的是"时间间隔方差 + 请求头完整性 + 访问路径"三个特征的组合判定。

具体可落地的判定信号:

  • 时间间隔方差:人的点击间隔方差大(常见 200ms~3s 波动),脚本是固定值。可用规则:同一 uid 连续 30 次请求间隔标准差 < 20ms → 高度疑似脚本。
  • 请求头:UA 为空、缺少 Accept-Language、没有 Referer、TLS 指纹(JA3)与 UA 声明不匹配。
  • 访问路径:正常用户会经过列表页再进详情页,爬虫常直接从 ID=1 顺序遍历详情页,且 ID 连续递增(这正是 ID 不能用自增整数的原因,改用 UUID 或雪花 ID 加混淆)。
  • 验证码通过率:同一设备指纹 5 分钟内触发 3 次验证码且全部秒过,反而是机器特征。

这些信号汇总成一个 0~100 的风控分,超过 60 分进入挑战,超过 85 分直接拒绝。

验证码怎么加才不误伤?

结论:验证码不要全量弹,只对风控分超阈值的请求弹,且必须分级——无感挑战优先,短信验证码最后。

分级设计:风控分 60~75 → 滑块验证(通过后发 10 分钟有效 token);75~85 → 短信/邮箱验证码;85 以上 → 临时封禁 30 分钟并记录设备指纹。

滑块验证要设有效期(建议 60 秒),token 与设备指纹绑定,防止一次性通过后转发给其他机器。全量验证码是最省事也最伤转化的做法,日活 10 万的应用全量加验证码,注册转化率掉 30% 是常态。

性能上最容易踩的坑是什么?

结论:风控本身不能成为瓶颈——每请求打 3 次 Redis 计数,在 10 万 QPS 下就是 30 万次 Redis 调用,会先把自己压垮。

解法是本地令牌桶 + Redis 全局配额的二级结构:单实例先在本地内存做原子计数(无网络开销),只把本地超阈值或全局配额相关的请求上报 Redis。本地计数按秒聚合后再批量写 Redis,写入频率从 10 万次/秒降到 1 次/秒。

同时,所有风控决策必须落日志,字段至少包含:请求 ID、规则 ID、命中原因、风控分、处置动作(放行/挑战/拒绝)、耗时。没有这份日志,你封错人的时候没法复盘,也没法向用户解释。

封禁策略要可回滚:内置白名单(内部 IP、合作方 key)、支持灰度(先只记录不拦截,跑 3 天看误伤率),误伤率超过 0.1% 就别上线拦截动作。

总结

防刷防爬的落地路径是:网关层用滑动窗口/令牌桶按 IP 和接口兜底,应用层按用户 ID 严格限流,风控层用时间间隔方差、请求头完整性和访问路径打风控分,60 分以上分级弹验证码,85 分以上临时封禁。数据侧再补上 ID 不可枚举、分页深度限制(最多 100 页)、单次返回条数上限和隐藏蜜罐链接。全程记住两条底线:别只按 IP 限流,别让风控调用次数超过业务本身的调用次数。

版权声明:本文来自 GJ站长论坛《接口防刷/防爬虫?》
原文链接:https://www.gj0.com/thread-725.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。

全部回复 0

还没有回复,来抢沙发~