TRACE 是什么
TRACE 是 HTTP 标准的诊断方法:服务器把收到的请求原样回显在响应体里,通常还带上 Via、Message 等描述中转节点的头字段。它的用途是观察请求穿过代理、网关、负载均衡时被改成了什么样,属于链路自检手段,而不是业务接口。
为什么几乎都被禁用
浏览器历史上存在配合 TRACE 的跨站追踪缺陷,攻击者可以借它读到带凭据的请求内容,于是主流服务器与网关改为默认关闭。Apache 默认 TraceEnable off,Nginx 本身不实现 TRACE,云负载均衡多数直接返回 405;现代替代方案是看 Via 头、抓包或用带详细日志的反向代理。
基本信息
| 方法语义 | 安全且幂等,不修改资源 |
|---|---|
| 规范 | RFC 9110 第 9.3.8 节 |
| 典型响应 | 200 回显请求内容;405 表示已被禁用 |
| 相关头 | Via、Max-Forwards、Content-Type: message/http |
| 默认状态 | Apache 关闭、Nginx 不支持 |
典型使用场景
- 排查请求经过多级代理后被改写的头字段,例如 Host 或认证头被替换
- 验证网关是否正确响应 OPTIONS/TRACE 这类探测方法
- 安全评估时确认目标没有开启该诊断能力
- 内网受控环境做链路自检,确认每一跳的中间节点都正确追加了 Via
探测与读取回显
探测与读取回显
curl -si -X TRACE https://www.example.com/ # 观察状态行
# HTTP/1.1 405 Method Not Allowed # 多数公网站点的实际结果
curl -si -X TRACE --max-redirs 0 http://10.0.0.9/ # 内网应用服务器可回 200
# 受控环境用 Max-Forwards 限制跳数,便于定位是哪一跳改写了请求
curl -si -X TRACE -H 'Max-Forwards: 0' http://proxy.internal/ | head -20常见响应与含义
| 响应 | 含义 | 下一步 |
|---|---|---|
| 200 带 message/http | 服务器实现了回显 | 仅内网保留,公网应关闭 |
| 405 Method Not Allowed | 已被服务器禁用 | 属预期结果,无需处理 |
| 501 Not Implemented | 服务器不识别该方法 | 同上,多见于精简实现 |
| 403 Forbidden | 被前置网关或 WAF 拦截 | 查 WAF 规则与访问日志 |
TRACE 与浏览器历史缺陷组合可形成跨站追踪:攻击者借回显读到带 Cookie 的请求内容。只要是面向公网的服务,保持关闭即可,不要为了排障长期开启。
需要观察链路改写时,更安全的做法是看响应头里的 Via、X-Forwarded-For,配合 Nginx 的调试日志或抓包,不必开启 TRACE。