API 被恶意调用的应对
发布时间:2026-08-13 20:13       
更新时间:2026-08-14 09:37
对外开放的 API 按四层布防,能挡住绝大多数恶意调用:限流、鉴权、签名、黑名单,一层比一层细。动手前先打开访问日志,确认被刷的接口、频率和来源分布:
awk '$7 ~ /api/ {print $1}' access.log | sort | uniq -c | sort -rn | head
日志里还要留意异常小的响应(探测请求)和异常大的响应(被拖数据的迹象),两者都值得追查。知道对手是谁、打在哪里,措施才有的放矢。
第一层:限流
对单 IP 限速,比如每秒 10 次,超出返回 429。Nginx 两行配置:
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
limit_req zone=api burst=20 nodelay;
阈值用正常流量的三到五倍起步,观察一周再收紧。多实例部署时限流放在统一入口做,各实例分别限等于放大了配额。
第二层:鉴权
接口一律要求 token,缺失或无效返回 401,token 带过期时间,放在缓存里管理,登出和封号时能主动失效踢掉。开放接口和登录接口的策略分开:公开只读接口可以放宽,写操作一律从严。没有鉴权的公开接口,等于把数据读权限挂在门上。管理类接口再加一层来源限制,只允许办公网调用。
第三层:签名
客户端对请求参数加时间戳计算签名(HMAC,一种带密钥的哈希算法),服务端验签并拒绝过期请求。签名的参与字段要覆盖关键参数,只签时间戳不签参数等于没签。它的作用是让抓包重放失效;密钥定期轮换,泄露时有兜底。时间戳容差设五分钟以内,客户端与服务器的时钟用 NTP 同步好,不然正常请求也会被误判成过期。
第四层:黑名单
日志统计高频异常 IP 自动封禁,判定留缓冲:一分钟超过一百次才封,避免误伤走同一出口的办公网。封禁时长设几小时到一天,不做永久封禁;封禁动作留痕,误封申诉时有据可查。
验证与上线顺序
无 token 的请求应返回 401,超频请求应返回 429,用一条命令快速确认:
curl -i http://127.0.0.1/api/user
上线后每天扫一眼 429 和 401 的数量趋势,突然放量说明有新的攻击面。四层按顺序上线,限流和鉴权收益最高,先做这两层。把四层的生效情况整理成检查表,每次发版过一遍,防止新接口漏配。