API 中转站安全注意事项,接口防刷与数据传输防护
API 中转站的安全建设,核心是把"信任边界"划清楚:客户端不可信、公网不可信,甚至内部日志和缓存也不默认可信。下面按防刷和数据传输两条线讲。一、接口防刷:分层拦截1. 边缘层先做粗限流在 CDN / WAF / 网关层按 IP + API Key 做限流,先挡掉扫描、撞库和大流量刷量。关键接口单独设更严的阈值。
· 全局限流:防止突发流量打挂后端。
· 单 IP 限流:缓解 IP 滥用。
· 单 API Key 限流:一个 key 只能跑自己的配额。
· 单用户限流:登录态用户按 userId 限,避免共享账号互相影响。Cloudflare、Kong、Envoy 都支持这类能力[8][9][10]。2. 业务层再做细限流短信、登录、支付回调这类接口,光靠 IP 不够——攻击者换代理 IP 就能绕过去。建议加:
· 滑动窗口计数:比固定窗口更准,不容易在窗口切换时漏过一波。
· 用户行为识别:同一用户突然高频调同一个接口,直接进风控。
· 验证码挑战:高风险操作先滑块 / 无感验证,别每次都用图形码,太伤体验。
· 自动封禁:短时间大量 401/403/429,临时拉黑一段时间。3. 签名 + 时间戳防篡改重放每个请求带这几个公共参数:
X-Api-Key: xxx
X-Timestamp: 1727000000
X-Nonce: a1b2c3d4
X-Signature: sha256=xxxx
服务端校验顺序:
1.查
X-Api-Key 是否有效。
2.查时间戳是否在允许窗口内(比如 ±5 分钟)。
3.查
X-Nonce 是否重复,重复就是重放。
4.用同样算法重算签名,对不上直接拒。签名内容至少覆盖:method + path + timestamp + nonce + bodyHash。这样改路径、改参数、重发旧请求都会被拦。⚠️ 注意:密钥绝不能从前端响应里下发。前端拿到的 secret 谁都能抓包看到,等于没保护。4. JWT 只负责鉴权,不负责加密JWT 适合验身份、验权限,payload 默认 Base64 编码,不是加密。敏感数据不应放在 JWT 里。推荐做法:
· 短有效期 access token,比如 15 分钟。
· refresh token 单独管理、可撤销。
· 网关先验签名、过期时间、issuer、audience。
· 再查业务权限:这个 key 能不能调这个 service。二、数据传输防护:不只上 HTTPS 就完事1. 强制 HTTPS,拒绝明文 HTTP这是底线,但不是全部。HTTPS 只保护"传输管道",管不了日志、缓存、异常回显、第三方 SDK 这些漏数据的口子。生产环境建议:
· HTTP 直接返回 403,而非 301 跳转到 HTTPS[15]。
· TLS 1.2+,禁用 SSLv3、TLS 1.0/1.1。
· 证书自动续期,避免因证书过期导致服务中断。
· 内部服务之间也走 mTLS,机器对机器双向验身份[8]。2. 敏感字段再加一层业务加密涉及 Prompt、代码、文档、手机号、身份证、API Key、token 的场景,建议对敏感字段做字段级加密。推荐 AES-256-GCM + RSA 混合加密[16]:
· AES-GCM:加密业务数据,同时自带完整性校验,密文被改了解密直接报错。
· RSA:只用来传 AES 密钥,不直接加密大段业务数据,性能扛得住。流程大概是:
客户端:
aesKey = 随机生成
ciphertext = AES_GCM.encrypt(aesKey, requestBody)
encryptedKey = RSA.encrypt(serverPublicKey, aesKey)
发送 {encryptedKey, ciphertext}
服务端:
aesKey = RSA.decrypt(serverPrivateKey, encryptedKey)
requestBody = AES_GCM.decrypt(aesKey, ciphertext)
这样就算内部日志误打印了请求体,看到的也是密文,不是明文 Prompt 和密钥。3. 日志必须脱敏,不能裸奔中转站最危险的地方在于:所有请求都经过它。Prompt、代码、token、密钥全在服务器上,日志乱打就是重大泄露风险。至少做到:
· request/response body 默认不落全量明文。
· 密码、API Key、token、身份证号、手机号一律脱敏。
· 错误日志不回显入参、栈信息、上游密钥。
· 审计日志单独存,和 debug 日志物理分离。
· 日志存储加密、访问走 RBAC、保留周期按合规要求设。4. 上游凭证隔离中转站通常要代调用多个模型厂商。每个租户的上游 API Key 建议隔离:
· 数据库加密存储,避免明文存放。
· 运行时从 KMS / Vault 拉取,避免硬编码。
· 按租户隔离调用,避免混用。
· 定期轮换,泄露时可按租户快速撤销。
· 回调地址可配白名单,减少被冒用。三、监控告警:重点盯这几类
· 429 占比突增:可能正在被刷,或某个客户端配置错了疯狂重试。
· 同一 API Key 跨地域高频调用:大概率被盗用。
· 某接口 401/403 激增:撞库或枚举 key。
· 响应体大小异常:可能配置漏了,把上游原始错误或密钥带回了客户端。
· 上游账单异常上涨:免费额度被薅、key 被滥用。四、最容易踩的几个坑
· 只限流不鉴权:能挡暴力请求,挡不住合法 key 被盗用。
· 只上 HTTPS:管道安全了,日志、缓存、异常回显照样漏。
· 签名 secret 下发到前端:等于把钥匙发给所有人。
· JWT payload 当加密用:它只是编码,不是保险箱。
· 日志全量打印 request/response:中转站最怕这一条。
· 多租户上游 key 混用:一出问题连责任都分不清。一句话落地顺序:强制 HTTPS → 统一鉴权 → 多维度限流 → 签名防篡改 → 敏感字段加密 → 日志脱敏 → 密钥隔离 → 异常告警。