10 · Cache Key 与缓存安全
判断哪些查询参数、请求头、Cookie 和用户维度真正改变响应,避免缓存碎片、跨用户串读与 Web Cache Poisoning。
编辑与核验:橙宝书编辑团队 ·
完成结果
只有真正改变公开响应的维度才参与 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=1 与 file.jpg?a=2 共用对象,只有源站对两者返回完全相同的公开内容时才安全。
用输入—输出矩阵决定
| 输入维度 | 可能安全地忽略 | 必须隔离或直接绕过 |
|---|---|---|
| 查询参数 | 仅跟踪用途的 utm_*,且已证明不改变响应 | tenant、user、token、尺寸/格式、语言、版本 |
| 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 Armor | Free / 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 与 发布刷新流程连起来。
官方来源
这篇内容帮你完成目标了吗?
内测反馈只在当前浏览器生成,不会自动上传。