API接口如何防刷?

wen 开源项目 76

本文目录导读:

API接口如何防刷?

  1. 第一层:基础防御(门槛低,效果有限,但必须做)
  2. 第二层:中级防御(需要前后端配合,效果显著)
  3. 第三层:高级防御(基于大数据和行为分析,成本较高)
  4. 第四层:终极防御(非技术手段)
  5. 实战策略组合建议

API接口防刷是一个常见且重要的安全课题,核心思路是增加攻击者的成本,同时尽可能降低对正常用户的干扰

以下是业界主流且经过实践检验的防刷策略,从易到难、从基础到高级,你可以根据业务场景组合使用:

第一层:基础防御(门槛低,效果有限,但必须做)

这些是最基本的防护,能挡住大量“毫无技术含量”的脚本和爬虫。

  1. 请求频率限制(Rate Limiting)

    • 原理:限制同一IP、同一用户或同一API Key在单位时间内的请求次数。
    • 实现:在Nginx、API网关或应用层实现,常用算法:令牌桶、漏桶、滑动窗口。
    • 示例:对未登录用户,限制每个IP每分钟请求100次;对登录用户,限制每分钟1000次。
  2. User-Agent + Referer 校验

    • 原理:检查HTTP头中的 User-Agent 是否为常见浏览器/工具,Referer 是否为合法的来源域名。
    • 局限:极易伪造,只能防“最懒”的攻击者。
  3. 强制登录/API Key

    • 原理:只有认证用户才能调用敏感接口,这能将匿名攻击变为需要注册账号的攻击,增加了成本。
    • 改进:结合手机号/邮箱验证码注册,提高水军注册门槛。

第二层:中级防御(需要前后端配合,效果显著)

这些是大多数互联网产品的标准配置。

  1. 验证码(CAPTCHA)

    • 原理:在请求触发特定频率阈值或高危操作(如登录、下单)时,强制弹出图形验证码、滑块验证码或行为验证码。
    • 服务:Google reCAPTCHA (v3 无感)、极验、腾讯防水墙等。
    • 策略:不要每次都出,而是在可疑行为出现后再弹出,用户体验更好,连续输错3次密码后弹出。
  2. 签名机制

    • 原理:客户端使用约定的算法(如 HMAC-SHA256),将请求参数(如时间戳、随机数、请求体)组合生成一个签名 sign 放在请求头中,服务端用相同算法校验。
    • 关键点
      • 时间戳:防止重放攻击(只接受5秒内的请求)。
      • 随机数/Nonce:防止同一签名在短时间内被重复使用(服务端需要缓存已用的Nonce)。
    • 效果:攻击者不知道签名密钥,就无法构造有效请求。
  3. IP 黑/白名单

    • 原理:对短时间内请求失败率极高(如500错误、401错误)或频率远超阈值的IP,自动加入黑名单,对可信的API调用方(如内部服务、合作伙伴服务器)加入白名单。

第三层:高级防御(基于大数据和行为分析,成本较高)

适用于核心业务、高价值场景。

  1. 设备指纹

    • 原理:通过JavaScript采集客户端的环境信息(屏幕分辨率、GPU型号、浏览器插件、时区、字体列表等),生成一个唯一的 设备ID
    • 作用:可以识别出“一个IP背后有100个不同的虚拟设备”这种异常情况,或者“一个设备ID短时间内切换了多个账号”的刷子行为。
  2. 人机行为分析

    • 原理:分析用户的操作轨迹。
      • 鼠标轨迹:真人操作通常有自然的抖动和停顿,而机器人的移动轨迹是完美的直线或角点。
      • 点击间隔:真人点击间隔是随机的,机器人则非常均匀。
      • 页面停留时间:真人需要阅读时间,机器人可能瞬间提交。
    • 服务商:阿里云验证码、腾讯滑块、顶象等。
  3. 业务层逻辑风控

    • 原理:结合业务数据做AI判断,这是最强、也是最复杂的防御。
    • 示例
      • 营销活动(领优惠券):同一收货地址、同一手机号、同一支付账号短时间内下了10单,判定为“羊毛党”。
      • 评论系统:一个IP发表大量内容相同、时间间隔极短的评论。
      • 投票系统:所有票都在深夜0点-5点之间投出,且来源IP段高度集中。

第四层:终极防御(非技术手段)

  1. 法律与合同约束

    在API文档中明确声明禁止滥用,对合作方,通过合同约定调用上限和惩罚措施。

  2. 人机验证升级

    当AI攻破简单验证码后,可以用更复杂的交互,如文字点选、空间推理等。

实战策略组合建议

不要只用单一方法,应该分层部署:

  • 防护1(网关层,无感):做全局的IP频率限制 + 黑白名单
  • 防护2(应用层,低感):对高频IP或用户,弹出滑块验证码
  • 防护3(核心逻辑层):对订单、支付、优惠券等核心接口,强制使用签名机制 + 设备指纹 + 业务风控
  • 防护4(兜底):建立监控告警,当API响应时间、错误率、特定接口调用量突然飙升时,立刻告警并自动触发限流/熔断。

总结一句话: 最理想的防刷是让机器觉得“麻烦”而放弃,让用户觉得“便捷”而继续,这需要根据你的业务价值,动态地、组合地使用上述策略。

抱歉,评论功能暂时关闭!