橙宝书
CDN 与网站加速

10 · Cache Key 与缓存安全

判断哪些查询参数、请求头、Cookie 和用户维度真正改变响应,避免缓存碎片、跨用户串读与 Web Cache Poisoning。

编辑与核验:橙宝书编辑团队 ·

CDN · PHASE 4高级约 30 分钟Cache Key · Poisoning · Deception Armor

完成结果

只有真正改变公开响应的维度才参与 Cache Key;营销参数可以在证据充分时合并,身份与私有变体不会因遗漏键维度而互相串读,刷新策略也能覆盖所有实际缓存变体。

Cache Key 是缓存对象的身份

flowchart LR
  A[请求 URL + 选定输入] --> B[生成 Cache Key]
  B --> C{键相同?}
  C ----> D[允许复用同一缓存对象]
  C ----> E[保存或读取不同变体]

把一个维度从键中移除,会提高复用率,但也会把请求合并到同一对象;增加维度会隔离响应,但可能让每个对象几乎都只命中一次。优化目标不是键越短或越长,而是:响应相同的请求共用键,响应不同的请求绝不共用键。

Cloudflare 默认会考虑查询字符串,Origin 请求头默认也参与键以支持 CORS 边界。切换 Ignore Query String 会让 file.jpg?a=1file.jpg?a=2 共用对象,只有源站对两者返回完全相同的公开内容时才安全。

用输入—输出矩阵决定

输入维度可能安全地忽略必须隔离或直接绕过
查询参数仅跟踪用途的 utm_*,且已证明不改变响应tenantusertoken、尺寸/格式、语言、版本
Cookie公开页面上不影响输出的分析 Cookie会话、权限、购物车、实验组、草稿预览
请求头不被应用读取,也不反射进响应Authorization、租户、语言、设备或自定义变体头
Hostname同一站点同一内容且授权边界一致多租户自定义域名、不同品牌或权限域
地区/设备/语言源站始终返回同一字节真正的地区法规、设备模板或语言变体

不要把秘密放进可缓存 URL

查询参数参与 Cache Key 不等于授权。令牌、签名、用户 ID 或私有对象地址可能出现在日志、分析与浏览器历史中。私有响应应先 Bypass,并由应用完成身份与对象权限校验。

三类安全事故

维度遗漏:跨变体串读

应用根据 X-Tenant 返回不同页面,但该头不在键中,两个租户就可能共享对象。对无法使用完整自定义键的套餐,优先拆 Hostname/路径或绕过,而不是假装它们相同。

未纳入键的输入被反射:缓存投毒

若源站把任意请求头写入 HTML,而该头不在 Cache Key,攻击者可能先让恶意版本进入缓存,再由普通访客命中。只缓存真正静态、不会依赖未受信输入的响应;不要把未验证头反射进正文、跳转或资源 URL。

GET body 改变响应

Cloudflare 不把 GET 请求 body 纳入 Cache Key。若应用让 GET body 改变输出,同一个键可以对应不同响应。改用语义正确的请求设计,或让该路径绕过缓存。

套餐与能力边界

能力当前可用性
Cache Deception ArmorFree / Pro / Business / Enterprise
Ignore Query String、Sort Query String、Cache by Device Type所有套餐
自定义 Query、Header、Cookie、Host、User 维度Enterprise

Cache Deception Armor 用于降低攻击者把动态路径伪装成静态扩展名的 Web Cache Deception 风险,但不能替代正确的路由分类、响应头与身份绕过。

安全变更流程

收集成对请求

为每个候选维度准备两条只改变该维度的请求,保存状态码、响应头、正文哈希和权限上下文。例如分别用两个 utm_source、两个语言值和两个测试账号请求同一 URL。

证明输出是否相同

只有在所有相关状态、正文、跳转、CORS 与 Cookie 行为都一致时,才能合并该维度。未知情况保持默认键或 Bypass。

在测试 Hostname 修改

先只修改一个维度,开启 Cache Deception Armor。若使用 URL Normalization,按照官方建议同时评估 Normalize URLs to origin,避免缓存使用的规范 URL 与源站收到的 URL 不一致。

用 Trace 和交叉客户端验证

用 Cloudflare Trace 查看实际 Cache Key 参数,再用匿名、账号 A、账号 B 和不同变体成对请求。成功标准不是命中率变高,而是同内容合并、异内容隔离。

同步刷新设计

自定义键若含 Header、Cookie、设备、地区或语言,单 URL Purge 可能需要同时提供形成键的值。先证明发布系统能刷新每个变体,再将键推广到生产。

下一篇把 Cache Key 与 发布刷新流程连起来。

官方来源

这篇内容帮你完成目标了吗?

内测反馈只在当前浏览器生成,不会自动上传。

本页目录