P230 · 安全与权限

缓存键包含所有影响结果的参数

Cache keys encode response-changing inputs

把会改变响应的输入都纳入缓存键,避免返回其他请求的旧结果。

编辑审核

以下示例与示意结果由本站编写,用于说明方法,不是模型实测结果。

使用场景

租户TA和TB访问同一个报告URL,地区和权限也不同。仅用URL缓存会把首个查看者的响应给其他请求;教学缓存键必须包含实际影响可见结果的上下文。

具体做法

追响应依赖,列报告/数据版本、租户、查看者或有效授权范围、语言/地区及功能状态。用无歧义编码构造键,敏感信息不直接写日志;定义新鲜度和失效/版本策略。每次授权仍核当前权限,不能用缓存旧许可代替;关键实时数据不在未满足契约时缓存。内容哈希仅适合结果只依赖相同内容和配置的情况。

反例

用/report作唯一键,TA中文管理员响应复用给TB英文普通用户,称性能提高。

改进写法

为教学报告按版本、tenant、locale和实际权限/查看者依赖构造键,TA/zh/admin与TB/en/member不可共用。声明陈旧窗口及变更策略,权限变更后重核;记录命中身份,不暴露秘密或把路径哈希视为万能键。

为什么这样改

缓存复用隐含“这些输入结果相同”,漏掉依赖就可能返回错身份数据。完整键与新鲜度策略使性能收益不以响应正确性为代价。

如何验证

教学相同上下文可命中,不同租户/语言/权限各自缺失;数据版本变化不得用旧键返回。撤销权限后不能继续读旧管理员响应。检查输出与请求身份,不能只看缓存命中率。

适用边界

依赖集合可能动态变化,键完整不等于授权正确。高基数与戳穿需独立性能设计,TTL也不保证实时正确。源示例禁止陈旧场景应结合实际契约,不能用冻结费率或性能数作现行结论。

原文与版本

如何收录这些方法