Host 头为什么会影响安全
应用如果直接把请求里的 Host 头当作可信输入,会同时影响三件事:生成的绝对链接(密码重置邮件里的域名)、跳转地址(登录后回跳)、缓存键(共享缓存把内容存给谁)。检查方式是用自有账号触发关键链路,替换 Host 与 X-Forwarded-Host 后对比生成的链接与路由去向。边界很清楚:只用自有账号与自有链路,绝不拿他人邮箱去触发重置。
基本信息
| 关注点 | 密码重置链接、跳转地址、缓存键、多租户路由 |
|---|---|
| 测试方法 | 替换 Host 与 X-Forwarded-Host,对比链接域名与路由变化 |
| 前置确认 | 先问清反向代理是否重写 Host,否则结论无法复现 |
| 边界 | 仅使用自有测试账号与自有链路 |
| 修复方向 | 为站点配置固定的规范域名,不信任请求头中的 Host |
典型使用场景
- 评估密码重置与邀请链接是否会泄露令牌到攻击者可控域名
- 核查登录后的跳转地址是否允许外部域名
- 多租户系统的路由判断:Host 是否被用作租户标识
- 共享缓存场景下的缓存键构成分析
- 验证修复:域名是否已改为服务端配置项而非依赖请求头
检查步骤
检查步骤
# 1. 用自有账号触发重置,记录邮件或响应中的链接域名
curl -s -X POST https://example.com/api/reset -d 'email=own-test@example.com'
# 2. 替换 Host 与转发头后重放,观察生成的链接是否跟着变化
curl -s -X POST https://example.com/api/reset \
-H 'Host: evil.example' -H 'X-Forwarded-Host: evil.example' -d 'email=own-test@example.com'
# 3. 观察跳转类接口是否受理外部域名参数
# 4. 记录现象与影响链路;缓存相关验证先与客户约定窗口现象与影响
| 现象 | 影响 | 处置 |
|---|---|---|
| 重置链接域名随 Host 变化 | 令牌可能被引导到攻击者域名 | 列为缺陷,要求改为固定配置域名 |
| 跳转地址接受外部域名 | 钓鱼跳转与令牌泄露风险 | 要求跳转白名单校验 |
| 缓存键未包含 Host | 内容可能在租户或站点之间串用 | 评估缓存层配置,先约定验证窗口 |
| 反向代理重写 Host 后无变化 | 结论不可复现 | 记录代理配置,说明验证局限 |
修复视角:为每个站点配置固定的规范域名,应用不信任请求头中的 Host 做安全决策;转发头只在受信代理链路内使用。
不要用他人邮箱触发密码重置来验证:这既触碰他人隐私,也会给对方发送真实邮件,属于明确的越界行为。