host-canonical-resolver.php
【前置:配置读得到吗】
✅ 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