- 什么是
TRACE方法? - 它为什么是安全风险?
- 如何检查服务器是否启用了
TRACE? - 如何禁用
TRACE方法?
什么是 TRACE 方法?
TRACE 是 HTTP 协议中定义的一种请求方法,其主要目的是用于诊断和调试。

当一个客户端(如浏览器)向服务器发送 TRACE 请求时,服务器会收到这个请求,然后将收到的原始请求头(Headers)和请求体(Body)原封不动地作为响应体(Body)返回给客户端。
TRACE 就像一面镜子,服务器会把所有关于这次请求的细节都“照”出来给你看。
为什么 TRACE 是安全风险?
TRACE 方法本身的设计意图是无害的,但它会引发一个严重的安全漏洞,这个漏洞被称为 跨站跟踪攻击。
攻击原理如下:

- 窃取会话 Cookie: 许多现代网站为了防止跨站请求伪造,会在响应头中设置一个标志,
HttpOnly和Secure的 Cookie,或者一个名为SameSite的属性,这些标志旨在防止恶意网站通过脚本(如 JavaScript)读取或发送这些 Cookie。 - 绕过保护: 攻击者可以诱导你登录了一个目标网站(比如你的网上银行),攻击者会诱使你的浏览器向这个已登录的网站发起一个
TRACE请求,这个请求会自动携带你当前的会话 Cookie。 - 信息泄露: 由于
TRACE请求会返回完整的原始请求,其中就包含了你被窃取的 Cookie 信息。 - 会话劫持: 攻击者获取到你的 Cookie 后,就可以在自己的浏览器中使用这个 Cookie 来冒充你的身份,完全控制你的会话,从而访问你的账户、进行转账等操作。
TRACE 方法绕过了浏览器为防范 CSRF 而设置的安全策略,成为了攻击者窃取敏感会话信息的“后门”,在生产环境中,TRACE 方法不应该被启用。
如何检查服务器是否启用了 TRACE?
您可以使用命令行工具 curl 或在线安全扫描工具来检查。
使用 curl (推荐)
在您的命令行中,对您的服务器域名或 IP 地址执行以下命令:
curl -v -X TRACE http://your-server.com
-v:显示详细的通信过程(verbose mode)。-X TRACE:指定使用TRACE方法发送请求。
如何解读结果:

-
如果服务器禁用了
TRACE: 您会收到一个405 Method Not Allowed(方法不允许) 或501 Not Implemented(未实现) 的 HTTP 状态码。< HTTP/1.1 405 Method Not Allowed < Allow: GET, HEAD, POST, PUT, DELETE, OPTIONS这表示服务器拒绝执行
TRACE方法,并且通常会在Allow响应头中列出它所支持的方法。这是安全的状态。 -
如果服务器启用了
TRACE: 您会收到一个200 OK的 HTTP 状态码,并且响应体中会完整地显示您刚才发送的TRACE请求头。< HTTP/1.1 200 OK ... (其他响应头) ... TRACE / HTTP/1.1 Host: your-server.com User-Agent: curl/7.81.0 Accept: */*看到
200 OK并且响应体里有请求内容,说明您的服务器存在安全漏洞,需要立即修复!
如何禁用 TRACE 方法?
禁用方法取决于您使用的 Web 服务器类型。
针对 Apache 服务器
使用 mod_rewrite (推荐)
这是最简单、最通用的方法,适用于大多数 Apache 配置。
在您的 Apache 主配置文件(通常是 httpd.conf)或虚拟主机配置文件中,添加以下指令:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^TRACE
RewriteRule .* - [F]
</IfModule>
RewriteEngine On:开启重写引擎。RewriteCond %{REQUEST_METHOD} ^TRACE:匹配所有请求方法为TRACE的请求。RewriteRule .* - [F]:对匹配到的请求返回一个 403 Forbidden 错误,并阻止其继续处理。
使用 mod_headers
您也可以通过添加一个自定义响应头来禁用 TRACE。
<IfModule mod_headers.c> Header always unset TRACE </IfModule>
在您的虚拟主机配置中,明确拒绝 TRACE 方法:
<LimitExcept GET POST HEAD PUT DELETE OPTIONS CONNECT PATCH PROPFIND PROPPATCH MKCOL COPY MOVE LOCK UNLOCK> Require all denied </LimitExcept>
这个 <LimitExcept> 块会允许括号里列出的所有方法,并拒绝其他所有方法(包括 TRACE)。
应用更改: 保存文件后,重启或重新加载 Apache 配置:
sudo systemctl reload apache2 # (对于 Debian/Ubuntu) sudo systemctl reload httpd # (对于 CentOS/RHEL)
针对 Nginx 服务器
Nginx 默认不启用 TRACE 方法,但如果您的自定义配置中启用了,可以这样禁用。
在您的 Nginx 配置文件(如 nginx.conf 或站点配置文件)的 server 块中,添加以下指令:
server {
# ... 其他配置 ...
# 禁用 TRACE 方法
if ($request_method = 'TRACE') {
return 405;
}
# 或者更严格的写法
# if ($request_method !~ ^(GET|HEAD|POST|PUT|DELETE|OPTIONS|PROPFIND|PROPPATCH|MKCOL|COPY|MOVE|LOCK|UNLOCK|PATCH)$ ) {
# return 405;
# }
# ... 其他配置 ...
}
应用更改: 保存文件后,重启或重新加载 Nginx 配置:
sudo systemctl reload nginx
针对 Tomcat 服务器
在 Tomcat 的 web.xml 部署描述符中,您可以禁用特定的 HTTP 方法。
在您的 Web 应用的 WEB-INF/web.xml 文件中,添加以下内容:
<security-constraint>
<web-resource-collection>
<web-resource-name>Entire Application</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>TRACE</http-method>
</web-resource-collection>
<auth-constraint>
<!-- 这里可以留空,表示完全禁止 -->
</auth-constraint>
</security-constraint>
应用更改:
保存 web.xml 文件后,重启 Tomcat 服务器。
| 步骤 | 操作 |
|---|---|
| 检查 | 使用 curl -v -X TRACE http://your-server.com 确认漏洞是否存在。 |
| 修复 | 根据您的服务器类型(Apache/Nginx/Tomcat),选择相应的方法进行配置修改。 |
| 验证 | 修复后,再次使用 curl 命令检查,确保返回 405 Method Not Allowed。 |
| 重启 | 重载或重启您的 Web 服务器,使配置生效。 |
| 持续监控 | 定期进行安全扫描,或使用工具(如 nmap 的 --script http-trace)来确保 TRACE 方法不会被意外重新启用。 |
重要提示: 在修复前,请务必备份您的服务器配置文件,以防配置错误导致服务中断,如果对操作不熟悉,建议咨询专业的系统管理员或安全专家。
