RESTful Request:GET/PUT/DELETE/POST/HEAD/OPTIONS

本文详细介绍了RESTful架构中常见的HTTP请求方法,包括GET、PUT、POST、DELETE、HEAD及OPTIONS的具体用途与区别,帮助理解如何正确使用这些方法来操作Web资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RESTful Request:GET/PUT/DELETE/POST/HEAD/OPTIONS

在RESTful的Web世界里,我们真正可以操作的Request类型其实很少,HTTP仅提供了寥寥无几的几种Request,其中绝大多数Web操作都是由以下四种Request来完成的:

  1. HTTP GET: 获取资源
  2. HTTP PUT/POST: 创建/添加资源
  3. HTTP PUT: 修改资源
  4. HTTP DELETE: 删除资源

本文将介绍上述四种Request类型的使用,同时也会简略介绍HEAD与OPTIONS请求。

参考书籍:《RESTful Web Services》, Chapter 4, “The Resource-Oriented Architecture”


GET, PUT和DELETE

GET请求用于向Server端获取资源,而DELETE请求则用于删除Server端的某个资源。GET的Response一般包含资源的内容,而DELETE的Response可能包含一些状态信息(删除成功或者失败),也可能什么都不包含。
比如:GET /web/blog/3 这个请求会获取第三篇blog的内容,而DELETE /web/blog/3 这个请求则会删除第三篇blog。

PUT请求用于在Server端创建新的资源 (create),或者对已有资源进行修改 (modify)。PUT请求中一般会包含该新资源的内容。
比如:PUT /web/blog 这个请求会在Server端创建一个新的资源,资源名称是blog;而PUT /web/blog/3 这个请求则会修改第三篇blog(用新的内容来覆盖旧的)。


POST

POST请求也可用于在Server端创建新资源,但是在RESTful的世界里,POST请求被定义为创建“从属资源”(拥有父资源的资源) (add)。这话比较拗口,看一下例子可能会清晰很多:

在Server端没有/web/blog的情况下,使用PUT /web/blog请求可以在Server端创建blog资源。blog资源创建好之后,可以使用POST /web/blog来添加一篇新的blog文章,POST请求成功后,我们就拥有了/web/blog/1这个资源。假如当前已经有了三篇blog (/web/blog/1, /web/blog/2和/web/blog/3),那么POST /web/blog将在Server端添加第四篇blog文章(/web/blog/4) — 在这个场景中,/web/blog/1, /web/blog/2, /web/blog/3和/web/blog/4都是“从属资源”(拥有/web/blog这个父资源的资源)。

如何来判断某次Request涉及的资源是从属资源呢?除了从概念逻辑上判断外,还有一个简便的方法来判定:对于POST请求来说,将要被添加的“从属资源”是URI未知的 — 在POST /web/blog请求添加新的一篇blog文章的时候,client并不知道这会是第几篇blog,也不知道该blog创建后的URI是什么(/web/blog/35? 还是/web/blog/42?)。与此相反,PUT请求创建、修改资源的时候,client端清楚的知道对应的URI (PUT /web/blog可以创建blog资源;在/web/blog已经存在的情况下,PUT /web/blog可以修改blog资源的设置;而PUT /web/blog/3则可以对某一篇特定的blog文章进行修改)。

除了添加新的“从属资源”,POST请求还有一种应用场景:对某个特定资源增补内容(append)。比如,对于第三篇blog,在blog的最后,添加一段内容 (POST /web/blog/3)。

对于PUT和POST的区别,我们总结为:

PUT用于创建(Create)或修改(Modify),而POST用于添加(Add)或增补(Append)

根据上述总结可推论,在PUT和POST的属性之间,还有一个重要的区别:PUT是幂等的(Idempotent),而POST不是 — 同一个操作连续进行多次,对于PUT而言其效果与只进行一次相同,但对于POST而言,每一次操作都会对Server端产生影响。


HEAD和OPTIONS

HEAD请求用于获取某个资源的元数据(metadata)–比如,该资源是否存在,该资源的内容长度是多少等等。

OPTIONS请求用于获取某个资源所支持的Request类型,在OPTIONS请求的Response中会包含Allow头信息,比如:

Allow: GET HEAD 

上述例子表示该资源只支持GET请求与HEAD请求。

值得注意的是,在OPTIONS请求中,不同的Request头信息会影响最终返回的Response结果。比如,在OPTIONS请求中加入正确的Authorization信息,得到的访问权限就可能更高。

<think>我们正在处理一个关于HTTP安全漏洞的问题:如何禁用HTTP TRACE和TRACK方法以防止安全漏洞。 根据用户提供的引用和问题描述,我们知道: - HTTP TRACE方法可能被用于跨站追踪(XST)攻击,攻击者可以利用此方法窃取用户的会话信息(如Cookie)。 - 同样,TRACK方法(主要用于Microsoft IIS服务器)也有类似的安全风险。 - 用户希望禁用这两种方法。 解决方案: 我们可以通过配置Web服务器来禁用TRACE和TRACK方法。不同的Web服务器配置方法不同,下面将分别介绍。 1. Apache服务器 在Apache中,我们可以使用mod_rewrite模块来禁用TRACE和TRACK方法。 步骤: a. 确保mod_rewrite模块已启用(通常默认启用)。 b. 在Apache配置文件(如httpd.conf)或虚拟主机配置文件中,或者.htaccess文件中,添加以下规则: ```apache RewriteEngine On RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK) RewriteRule .* - [F] ``` c. 重启Apache服务。 解释:上述规则将所有TRACE和TRACK请求重写为403 Forbidden。 2. Nginx服务器 在Nginx中,我们可以通过配置server块来限制这些方法。 步骤: 在Nginx的server配置中添加: ```nginx server { # ... 其他配置 ... if ($request_method ~ ^(TRACE|TRACK)$) { return 403; } } ``` 然后重新加载Nginx配置。 3. Microsoft IIS服务器 在IIS中,我们可以通过URL重写模块来禁用这些方法。 步骤: a. 安装IIS的URL重写模块(如果尚未安装)。 b. 打开IIS管理器,选择站点,然后打开“URL重写”功能。 c. 添加一个入站规则: - 匹配请求方法:TRACE 和 TRACK(用竖线分隔) - 操作类型:自定义响应(状态码设为403) 或者通过web.config文件配置: ```xml <system.webServer> <rewrite> <rules> <rule name="Block TRACE and TRACK" stopProcessing="true"> <match url=".*" /> <conditions> <add input="{REQUEST_METHOD}" pattern="^(TRACE|TRACK)$" /> </conditions> <action type="CustomResponse" statusCode="403" statusReason="Forbidden" /> </rule> </rules> </rewrite> </system.webServer> ``` 4. 其他Web服务器 对于其他Web服务器(如Lighttpd、Tomcat等),思路类似:检查请求方法,如果是TRACE或TRACK,则返回403。 验证方法: 我们可以使用curl命令来测试服务器是否已经禁用TRACE方法: ```bash curl -X TRACE http://your-server/ ``` 如果返回403 Forbidden,则表示配置成功。 安全建议: 除了禁用TRACE和TRACK方法外,还应该确保服务器只允许必要的方法(如GETPOSTPUTDELETE等)。可以通过配置服务器只允许特定的HTTP方法。 例如,在Apache中,可以使用: ```apache <Location "/"> <LimitExcept GET POST> Deny from all </LimitExcept> </Location> ``` 在Nginx中,可以使用: ```nginx if ($request_method !~ ^(GET|POST)$ ) { return 405; } ``` 注意:在配置时要根据实际需求允许方法,比如RESTful API可能需要PUTDELETE等。 引用用户提供的参考: 引用[2]中提到,IBM Domino服务器可以通过配置禁用TRACE方法。用户可以参考IBM技术支持文档。 最后,用户可能还需要考虑其他安全措施,如启用HTTPS、配置安全的HTTP头部等。 生成相关问题: 1. 如何配置Web服务器只允许特定的HTTP方法? 2. 除了禁用TRACE和TRACK方法,还有哪些常见的HTTP安全配置? 3. 如何测试Web服务器的HTTP方法是否安全? 4. 在禁用HTTP方法后,如何验证配置已经生效?</think>### 禁用 HTTP TRACE/TRACK 方法的安全解决方案 HTTP TRACE 和 TRACK 方法可能被用于 **跨站追踪攻击(XST)**,攻击者可利用这些方法窃取用户 Cookie 或敏感信息。以下是针对不同服务器的禁用方案: --- #### 🔧 1. **Apache 服务器** 在配置文件(`httpd.conf` 或虚拟主机配置)中添加: ```apache <Location "/"> # 禁用 TRACE 和 TRACK TraceEnable off <LimitExcept GET POST HEAD PUT DELETE OPTIONS> Require all denied </LimitExcept> </Location> ``` 重启服务生效: ```bash sudo systemctl restart apache2 ``` --- #### 🔧 2. **Nginx 服务器** 在 `server` 块中添加: ```nginx server { ... # 禁用 TRACE/TRACK if ($request_method ~ ^(TRACE|TRACK)$) { return 405; } # 仅允许必要方法 add_header Allow "GET, POST, PUT, DELETE, OPTIONS" always; } ``` 重载配置: ```bash sudo nginx -s reload ``` --- #### 🔧 3. **Microsoft IIS 服务器** 1. 打开 **IIS 管理器** → 选择站点 → **请求筛选** 2. 在 **HTTP 方法** 选项卡中: - 拒绝 `TRACE` 和 `TRACK` - 仅允许 `GET, POST, PUT, DELETE, HEAD, OPTIONS` 3. 通过 **Web.config** 强制生效: ```xml <system.webServer> <security> <requestFiltering> <verbs allowUnlisted="false"> <add verb="GET" allowed="true"/> <add verb="POST" allowed="true"/> <!-- 添加其他允许的方法 --> </verbs> </requestFiltering> </security> </system.webServer> ``` --- #### 🔧 4. **IBM Domino 服务器** [^2] 在 `notes.ini` 文件中添加: ```ini HTTPDisableMethods=TRACE,TRACK ``` 重启 Domino 服务生效。 --- ### ✅ 漏洞验证方法 使用 `curl` 测试禁用效果: ```bash # 测试 TRACE 方法 curl -X TRACE http://your-server.com # 测试 TRACK 方法 curl -X TRACK http://your-server.com ``` ✅ **正常响应**:应返回 `405 Method Not Allowed` 或 `403 Forbidden` ❌ **风险响应**:返回 `200 OK` 并显示请求头信息 --- ### 📌 关键安全建议 1. **最小化方法暴露** 仅开放业务必需的 HTTP 方法(如 GET/POST),禁用其他方法。 2. **强制安全头部** 添加 `Content-Security-Policy` 和 `X-Content-Type-Options` 头部: ```nginx add_header Content-Security-Policy "default-src 'self'"; add_header X-Content-Type-Options "nosniff"; ``` 3. **定期扫描验证** 使用工具检测: ```bash nmap -p 80,443 --script http-methods your-server.com ``` > 配置后需全面测试业务功能,避免误拦截合法请求。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值