HTTP 方法详解:GET、POST、PUT、DELETE、HEAD、OPTIONS、PATCH、CONNECT、TRACE

为什么审计师要死磕这些方法?

说实话,很多人觉得 HTTP 方法就是 REST API 的标配,看看文档就完事了。但在安全审计里,这些方法就是攻击者的导弹发射架。我经手过好几个案例——攻击者利用不安全的 PUT 方法直接往服务器写 webshell,或者用 TRACE 方法偷 Cookie。你想想看,如果连方法的安全属性都搞不清楚,审计报告就是废纸。

先搞懂两个核心概念:安全性与幂等性

安全性:调用这个方法会不会改变服务器资源?不会,就是安全的。注意,日志记录不叫改变资源。

幂等性:不管你调用 1 次还是 100 次,资源状态都一样。嗯,这个在重试场景里特别重要。

审计口诀:安全的方法可以在不通知用户的情况下缓存;幂等的方法可以放心重试。

逐个方法拆解

GET —— 最老实的请求

安全 + 幂等。GET 只读不写,这是铁律。但我在项目里见过有人用 GET 传 JSON body 做删除操作——我直接标记为高危。记住:审计时如果看到 GET 请求导致资源变化,不是设计错误就是漏洞。

# 标准 GET,安全且幂等
curl -X GET https://api.example.com/users/42
# 危险做法:用 GET 做删除
curl -X "GET" -d '{"action":"delete"}' https://api.example.com/users/42  # ❌ 审计必报

HEAD —— GET 的轻量版

安全 + 幂等。只返回响应头,不返回 body。常用于探测资源是否存在、检查缓存有效性。审计时要注意:有些 WAF 会阻断 HEAD 方法,但正常业务里 HEAD 不会带来任何副作用。

OPTIONS —— 探测服务器能力

安全 + 幂等。返回服务器支持的 HTTP 方法。在 CORS 预检里很常见。但攻击者会用 OPTIONS 扫描可用的不安全方法。我曾经发现一个服务器居然允许 TRACE 和 PUT,就是通过 OPTIONS 暴露的。

DELETE —— 不安全但幂等

不安全(会删资源),但幂等(删掉后资源就不存在了,再删还是不存在)。审计难点:多次 DELETE 返回 200 还是 404 都不影响幂等性定义。我在审计时发现一个系统 DELETE 第一次返回 200,第二次返回 404,虽然幂等,但日志里需要区分是正常删除还是重复攻击。

PUT —— 覆盖式更新

不安全但幂等。PUT 会把整个资源替换成你发送的表示。核心是你要发送完整资源。如果能成功替换,多次请求结果一样。我曾经遇到过一个团队用 PUT 做部分更新,结果幂等性全乱套了。

# 幂等:第一次创建用户42,第二次覆盖用户42
curl -X PUT -d '{"name":"Alice","age":30}' https://api.example.com/users/42

PATCH —— 部分更新,非幂等

不安全且非幂等。PATCH 只发送变更部分,而且依赖当前资源状态。举个例子:一个 PATCH 请求给计数器 +1,你发两次就加了两次。这就是非幂等。审计时要注意 PATCH 操作的原子性和重复防护。

POST —— 万用工作马,非幂等

不安全且非幂等。创建资源、提交表单、触发动作……几乎都在用。审计最头疼的就是 POST,因为非幂等意味着重试可能导致重复订单、重复扣款。我建议对 POST 接口做幂等性改造:加一个幂等键(Idempotency-Key),这是很多支付系统的标配。

CONNECT —— 隧道代理

既不安也不幂等。CONNECT 用来建立隧道,主要用于 HTTPS 代理。在审计中很少见到,但一旦出现就要高度警惕——攻击者可能用它绕过防火墙做内网穿透。

TRACE —— 调试方法,高危

不安全?其实 TRACE 理论上不会改变资源,但它会原样返回请求。攻击者可以用 TRACE + XSS 劫持 Cookie(跨站追踪攻击)。现在大多数生产环境都禁止 TRACE。我看到一次审计报告里服务器开放了 TRACE,马上标记为严重。

快速查阅表

方法安全幂等典型场景审计风险
GET✅✅读取资源低
HEAD✅✅检查元数据低
OPTIONS✅✅CORS 预检中(暴露方法清单)
DELETE❌✅删除资源中(需鉴权)
PUT❌✅完整替换中(上传漏洞)
PATCH❌❌部分更新高(非幂等)
POST❌❌创建/提交高(重复提交)
CONNECT❌❌隧道代理高(代理滥用)
TRACE✅*✅调试回显严重(XST攻击)

*TRACE 在安全定义上算“无副作用”,但实际风险极大,大多审计标准把 TRACE 视为不安全方法。

我曾经接手一个外发通道审计,发现业务系统对 PUT 接口没有做鉴权,攻击者直接上传了 JSP 文件。嗯,从那以后我每看到一个 PUT 请求,第一反应就是检查写入路径是否在白名单内。

审计中的实用技巧

  • 用 OPTIONS 摸清服务器底牌,但别只依赖它——有些服务器会隐藏危险方法。
  • 对非幂等方法(POST/PATCH)必须要求业务方提供幂等性方案(例如幂等键或乐观锁)。
  • TRACE 和 CONNECT 只要在生产环境出现,直接封禁,不要犹豫。
  • 如果看到 PUT 请求的 body 里包含文件内容,重点审计目标路径是否可执行。

我习惯在审计脚本里先发一个 OPTIONS 请求,再对每个返回的方法做一次安全属性验证。效率很高,覆盖也全。

一张图看懂方法与属性

HTTP 方法安全性与幂等性矩阵 安全 不安全 幂等 非幂等 GET HEAD OPTIONS DELETE PUT POST PATCH CONNECT TRACE(高危) 说明 • 绿色区域:安全且幂等,审计风险低,可放心缓存和重试 • 橙色区域:不安全但幂等,需鉴权控制,重试安全 • 红色区域:不安全且非幂等,必须做幂等性改造和防重放 • 紫色区域:特殊方法,默认应禁用,尤其TRACE

写在最后

方法本身的定义不难,难的是在流量审计里快速识别异常。我个人习惯是把每个方法的安全性和幂等性背下来——不,不是背表,是理解为什么。你想想看,如果攻击者用 PUT 上传了 webshell,那不是方法的错,是审计没发现非幂等方法被滥用了。

下次你看到一条外发流量带着 PUT 方法,心里就亮红灯吧。