防止敏感信息误缓存的核心是全链路主动阻断:默认禁用敏感接口缓存、隔离用户级cache_key、清理响应头防range攻击、强制覆盖cache-control头并物理隔离公开资源。

防止敏感个人财务数据或身份信息被误缓存在公共网关(如 Nginx Proxy)上,核心不是等缓存生成后再“擦除”,而是从请求进入、响应生成、缓存写入到头信息输出的全链路做主动阻断和隔离。关键在于:不缓存、不透传、不暴露、不继承。
一、默认禁用敏感接口缓存,用 proxy_no_cache 精准拦截
对涉及登录、账户查询、支付结果、身份证号展示等动态敏感接口,必须显式禁止缓存:
- 在对应 location 块中配置 proxy_no_cache $http_cookie $http_authorization; —— 只要请求带 Cookie 或认证头,一律不进缓存
- 补充指令:proxy_cache_bypass $http_cookie $http_authorization;,确保已缓存的旧响应也不会被返回给带凭证的用户
- 后端响应若含 Cache-Control: private 或 no-store,Nginx 默认尊重;但需确认未配置 proxy_ignore_headers Cache-Control,否则该策略会被忽略
二、隔离缓存 Key,避免用户间数据混用
即使缓存开启,也要确保每个用户看到的是自己专属内容,而非他人缓存副本:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 在 proxy_cache_key 中强制加入身份标识变量,例如:
proxy_cache_key "$scheme$request_method$host$uri$is_args$args$http_cookie$http_authorization"; - 若使用 JWT 或 session ID,可提取并拼入 key:$cookie_session_id 或 $arg_token(需配合 map 指令清洗)
- 切勿使用纯 URL 作为 cache key,否则 /user/profile 返回的响应可能被不同用户共享
三、清理响应头,防止敏感字段落入缓存文件头部
Nginx 缓存文件前几百字节会原样保存原始响应头(包括 Server、X-Debug-Info、甚至调试用的 X-User-ID),攻击者可通过 CVE-2017-7529 类 Range 攻击读取:
- 全局关闭版本暴露:server_tokens off;
- 清除所有非必要头:proxy_hide_header X-Powered-By; proxy_hide_header X-Debug-Info; proxy_hide_header X-User-ID;
- 对敏感响应,禁用 Accept-Ranges:add_header Accept-Ranges "none";(需 headers-more 模块支持)
- 不要用 add_header 拼接用户输入或请求参数,避免注入风险
四、强制覆盖缓存控制头,避免后端干扰网关策略
后端若返回 Cache-Control: no-cache 或过期时间极短的头,会直接覆盖你配置的 proxy_cache_valid 规则:
- 先屏蔽透传:proxy_hide_header Cache-Control; proxy_hide_header Expires;(必须放在 proxy_pass 后)
- 再主动注入统一策略:add_header Cache-Control "private, no-store" always;(always 确保 4xx/5xx 响应也生效)
- 对明确允许缓存的公开资源(如静态 JS/CSS),用独立 location 分离,并设置 public max-age,与敏感路径物理隔离
不复杂但容易忽略。










