公网API安全防护及请求域名校验方案咨询
公网API安全最佳实践与实现方案
一、公网API安全核心最佳实践
- 强制请求签名:仅依赖API Key风险过高,要求客户端对请求参数(含时间戳、请求路径、Body摘要)进行签名,服务端验证签名合法性的同时校验时间戳,防止重放攻击。
- 权限最小化配置:给每个API Key分配细粒度权限,比如仅允许调用指定接口、仅能读写特定资源,避免超权限访问。
- 严格速率限制:按API Key、IP维度设置请求频率上限,防止暴力破解或恶意流量冲击服务。
- 完整审计日志:记录所有API调用的请求来源、时间、接口、参数、返回结果,出现异常时可快速溯源排查。
- 定期密钥轮换:支持用户手动更换API Key,或提供自动轮换机制,降低密钥泄露后的持续风险。
- 全程HTTPS加密:强制使用TLS 1.2+加密传输,禁止HTTP请求,避免API Key被明文窃取。
二、现有API Key方案的优化建议
- 升级哈希存储算法:当前仅存哈希值的思路正确,但要替换为
bcrypt或Argon2这类慢哈希算法,避免被彩虹表快速破解,禁用MD5、SHA-1等快哈希。 - 增强API Key复杂度:生成密钥时,用UUID v4结合32位随机字节后做Base64编码,确保密钥足够长且无规律,降低被猜解的概率。
- 添加密钥生命周期管理:允许用户手动禁用/删除API Key,设置密钥过期时间,到期自动失效。
- 关联多因素验证:生成API Key时绑定用户主账号身份,若主账号启用MFA,需完成二次验证才能生成密钥,提升密钥创建环节的安全性。
三、可靠的请求域名校验方法
由于Host头可被伪造,单一维度校验不可靠,建议组合多种方式:
- 利用TLS SNI字段校验:TLS握手阶段的Server Name Indication(SNI)是客户端发起请求时指定的目标域名,该字段在HTTP层之前确定,难以伪造。服务端可从TLS连接信息中提取SNI,与用户配置的允许域名比对。
- 签名绑定域名:要求客户端将请求域名作为签名参数的一部分,比如签名串包含
域名+时间戳+API路径+Body摘要,服务端验证签名时,同时校验签名中的域名是否在用户允许列表内。即使Host头被篡改,签名不匹配会直接拒绝请求。 - 反向代理层前置校验:使用Nginx、CDN等反向代理时,在代理层配置仅允许指定域名的请求进入,同时确保代理层的请求头(如真实IP、域名)无法被客户端篡改——比如Nginx中仅信任来自可信CDN的转发头,忽略客户端直接发送的相关字段。
- Origin/Referer辅助校验:针对浏览器端发起的请求,可辅助校验Origin头(优先)或Referer头,但需注意这两个字段可能因浏览器策略限制为空,仅作为补充校验手段,不能单独依赖。
内容的提问来源于stack exchange,提问作者B. Sebastiano
相关产品推荐
相关产品推荐

