CDN缓存是将静态或可缓存的动态内容分发到边缘节点以加速访问的机制,能够降低源站负载并提升响应速度。缓存中毒指攻击者通过伪造请求或利用不当的缓存键/头配置,使恶意内容被缓存并分发给其他用户,导致页面篡改、敏感数据泄露或投放恶意脚本。

主要风险包括:一是缓存用户特定内容到公共缓存引起的隐私泄露;二是未校验输入造成HTML/JS被缓存并传播;三是缓存键策略不当导致不同用户共享本应隔离的数据。
常见诱因包括错误的Cache-Control配置、使用不安全的查询参数作为缓存键、缺乏请求头正常化以及在可被公开缓存的响应中包含个性化/敏感信息。
核心在于正确划分可缓存内容与不可缓存内容,使用严格的缓存键策略并结合验证机制(签名URL、短TTL、WAF等)来避免被动中毒。
首先要区分“公共可缓存”与“私有不可缓存”资源。对敏感响应应设置Cache-Control: no-store, no-cache, private等头,确保CDN与浏览器不缓存或仅私有缓存。
对公共资源使用明确的TTL(Cache-Control: max-age)并配合Vary头控制缓存分片(例如Vary: Accept-Encoding),避免不同用户/设备误用同一缓存。
1) API/用户数据返回加上Cache-Control: no-store;2) 静态资源使用版本化文件名(带指纹)并设置长TTL;3) 对需要按用户区分的资源用Cookie或Authorization不被纳入缓存键,或使用缓存键白名单。
使用X-Content-Type-Options: nosniff、Strict-Transport-Security等头减少被注入脚本和中间人攻击的风险,同时避免在缓存响应中包含PII(姓名、手机号、身份证号、token等)。
CDN通常提供多种安全能力:边缘WAF、请求去重/字段白名单、签名URL/签名Cookie、速率限制、请求头/查询参数过滤以及缓存键自定义。结合这些机制可以大幅降低攻击面。
1) 启用WAF并部署针对注入、跨站脚本、头欺骗的规则;2) 使用签名URL或短期签名Cookie保护私有内容;3) 在CDN侧只允许缓存白名单路径及扩展名;4) 正常化并限制可用于缓存键的请求头与查询参数。
对文件下载接口启用签名URL,对用户资料接口禁止公共缓存并在CDN配置中把Authorization和Set-Cookie从缓存键中排除。
检测方面可通过日志和比较边缘与源站内容差异、监控异常响应码和突增流量、以及定期爬取边缘节点内容来发现异常缓存内容。
1) 立即在CDN发起缓存清除(purge)或使受影响路径短TTL;2) 回滚源站错误配置并修复产生敏感数据的代码;3) 检查并更新缓存键/白名单策略;4) 启用更严格的审计与告警。
保留边缘日志、观察请求来源IP/UA、分析WAF拦截记录以判断攻击路径,并对外通告受影响范围与已采取的补救措施(视法律和合规要求)。
把缓存安全纳入SDLC与运维流程:在设计阶段定义哪些接口可缓存与不可缓存;在代码审查/CI中检查HTTP头与缓存相关配置;在发布时验证资源指纹化是否生效。
1) 建立缓存策略白名单与测试集,定期自动化扫描边缘节点内容;2) 将WAF策略与CDN缓存策略联动:对可疑路径临时设置no-cache并触发人工复核;3) 培训开发团队理解缓存与安全边界。
检查点包括:响应是否含敏感字段、Cache-Control是否正确、缓存键是否包含可变用户信息、是否启用了HTTPS与HSTS、WAF策略是否覆盖常见注入场景。