只放行业务需要的方法
HTTP 方法限制属于低成本高收益的加固:普通站点日常只需要 GET、POST,静态页面再加 HEAD,而 PUT、DELETE、TRACE、CONNECT 等方法正常业务根本用不到。默认拒绝未使用的方法,可以直接拦掉一批扫描与危险调用,也能避免 TRACE 交叉追踪这类老问题。
危险方法为什么该关
TRACE 会把请求原样回显,可被用来配合浏览器发起跨站追踪,读取带凭据的响应内容;PUT/DELETE 在服务器开启 WebDAV 或部分框架默认支持时能直接写文件、删资源,历史上多起 webshell 落地就是靠 PUT 完成。这些方法正常业务不会调用,默认拒绝等于直接抹掉一块攻击面,成本几乎为零。
基本信息
| 默认策略 | 只放行 GET/POST/HEAD,其余返回 405 |
|---|---|
| 按需开放 | PUT/DELETE/PATCH(REST API)、OPTIONS(跨域预检) |
| 实现位置 | WAF 规则、Nginx/Apache 配置均可 |
| 验证方式 | curl -X TRACE 等方法测试返回码 |
典型使用场景
- 对外 Web 站点上线前的基线加固
- REST API 按接口精确放行方法,而不是整站放开
- 前后端分离项目:OPTIONS 预检必须放行
- 审计要求证明应用只开放必要方法
- 应急期间快速缩小可探测面
Nginx 实现示例
Nginx 实现示例
# http 块:用 map 定义方法白名单,避免在 location 里堆 if
map $request_method $method_allowed {
default 0;
GET 1;
POST 1;
HEAD 1;
}
# server/location 块:非白名单方法直接拒绝
if ($method_allowed = 0) {
return 405;
}
# 前后端分离需要跨域时,为 OPTIONS 预检单独返回 CORS 头
if ($request_method = OPTIONS) {
add_header Access-Control-Allow-Origin 'https://app.example.com' always;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS' always;
return 204;
}
# 验证:curl -i -X TRACE https://example.com/ # 期望返回 405方法与限制建议
| 方法 | 常见用途 | 限制建议 |
|---|---|---|
| GET/HEAD | 页面与接口读取 | 放行 |
| POST | 表单与接口提交 | 放行 |
| OPTIONS | 跨域预检 | 按需放行并返回必要 CORS 头 |
| PUT/PATCH/DELETE | REST 资源修改与删除 | 按接口精确放行 |
| TRACE/CONNECT | 无正常业务用途 | 默认拒绝 |
方法限制建议默认启用;REST 风格接口要按业务精确放行,一刀切全拒会直接打断正常调用。
拦掉 OPTIONS 会让跨域预检失败,前端表现为接口无响应、控制台报 CORS 错误;遇到这类报错先确认是不是方法限制拦到了预检请求。