核心是控制缓存键生成、隔离数据源、限制缓存内容类型并强化校验:键须白名单过滤+哈希摘要,强制命名空间前缀,敏感数据仅存脱敏标识或加密载荷,启用锁机制与过期兜底防穿透。
核心是控制缓存键的生成逻辑、隔离数据来源、限制缓存内容类型,并在关键环节做校验和加固。
严格约束缓存键格式与生成规则
缓存键是攻击入口,必须杜绝动态拼接、用户可控字段直接入键。例如避免用未经处理的 $_GET['id'] 或 Host 头构造键名。
- 只允许字母、数字、下划线、短横线,长度不超过 255 字符
- 禁止出现 { }、/、@、:、 等特殊符号
- 对所有参与键生成的输入(如 URL 路径、查询参数、HTTP 头)先做白名单过滤或正则校验
- 推荐使用哈希摘要(如 sha256($safe_prefix . $normalized_input))替代原始值作为键
强制命名空间隔离与作用域限定
不同业务、不同权限等级的数据绝不能共用同一缓存空间,否则易被越权读取或覆盖。
- 按模块划分前缀:如 user:1001:profile、admin:config:feature_flags
- 敏感操作类缓存额外加租户/角色标识,例如 tenant:abc:role:editor:dashboard_data
- 禁止使用全局通配键(如 * 或 all:),也不建议用无区分度的键如 cache_123
缓存值不存原始敏感内容,只存脱敏标识或加密载荷
即使缓存被意外命中或泄露,也不能直接暴露明文数据。
- 用户身份、token、密码、手机号等字段一律不进缓存;只存不可逆哈希或短时效票据 ID
- 确需缓存结构化数据时,统一用 JSON + 签名校验 或 AES-256-GCM 加密,解密失败即丢弃
- 避免序列化含 PHP 对象、匿名函数、资源句柄等可执行上下文的数据
启用缓存项锁定与过期兜底机制
防止并发写入污染、长期未更新导致陈旧数据被滥用。
- 对高频更新键(如用户会话状态)启用分布式锁(Redis 的 SET key val NX EX 30)
- 所有缓存必须设置 max-age 或 expiresAfter(),禁用永久缓存(0 或 null)
- 对可能穿透缓存的请求(如查不存在的 ID),写入空值缓存并设短过期(如 60 秒),防缓存穿透