host-canonical-resolver.php

20260916-201504 轮 · 看它的历史
【前置:配置读得到吗】
  ✅ domain1 已是 ffjnc.ownnote.cn
  ✅ 槽位恒 5 个(空槽保留)

【① 开发白名单:APP_DEBUG=true + 命中 DEV_TRUSTED_HOSTS → 原样返回 + 请求 scheme】
  ✅ 前置:白名单里有带端口的开发 host
  ✅ host 原样(带端口)
  ✅ base 用请求 scheme(dev 是 http)
  ✅ h2 也在白名单里

【② 命中 domain1..5 → 原样返回 + https】
  ✅ host 原样
  ✅ base 强制 https(不看请求 scheme)
  ✅ 大小写不敏感 + 去尾点后仍命中

【③ 非法 Host → 回落 domain1(这就是 SEC-0001 要堵的那一步)】
  ✅ evil 被换成规范域名
  ✅ base 同样是规范域名
  ✅ 带端口的伪造 Host 也回落
  ✅ CLI 无 Host 也回落(cron 发信靠这条)

【④ domain1 为空 = 运维事故 → 返回空,不回落请求 Host】
  ✅ host 返空串
  ✅ base 返空串
  ✅ 🔴 绝不回落请求 Host
  ✅ 清缓存后立刻恢复(证明缓存可刷)

【⑤ 缓存真的在缓存(不是每次查库)】
  ✅ 读到的是缓存值而不是库值
  ✅ 删掉缓存后回到库值

【⑤b 缓存 TTL 必须是 10 分钟(用户拍板;File 驱动把 TTL 写在文件头)】
  ✅ 找得到 corp_domains 的缓存文件
  ✅ 文件头写着 600 秒

【⑥ _hostNormalize 边界】
  ✅ 剥 scheme 与路径
  ✅ IPv6 保方括号与端口
  ✅ 空串进空串出
  ✅ 尾点在端口前也去掉
  ✅ 不误伤中间的点

PASS=26 FAIL=0