禁用不安全的HTTP方法
一般web
服务支持GET、HEAD
和POST
方法来检索静态和动态内容。
公开的web
服务不应该支持其他HTTP
(例如OPTIONS
, TRACE
)方法,因为它们增加了攻击面。
通常生产环境下应该禁用这些方法(如果您确实不需要该方法)
TRACE
方法安全隐患:
开启TRACE
方法可能导致Cross-Site Tracing
(允许跨站点跟踪)攻击,该攻击可以捕获另一个应用程序用户的会话ID
。
并且,该方法还可以用来尝试识别有关应用程序操作的环境的附加信息(例如,应用程序路径上是否存在缓存服务器)。
OPTIONS
方法安全隐患:
开启OPTIONS
方法并不会产生直接威胁,但攻击者可以从OPTIONS
方法响应获取额外信息的来源,进而被攻击者利用已知漏洞。
HEAD
方法安全隐患:
开启HEAD
方法同样存在风险:尽管它并不被认为是危险的, 但它可以被用来通过模仿GET
请求来攻击web
应用程序。
其次,使用HEAD
可以通过限制服务器发送的数据量来加快攻击进程。
如果授权机制基于GET
和POST
,那么HEAD
方法可以允许绕过这些保护。
我认为,HEAD
请求通常被代理或CDN
用来有效地确定一个页面是否已经改变,而不需要下载整个页面(它对于检索写在响应头中的元信息很有用)。
更重要的是,如果禁用它,只会增加吞吐量成本。
如何通过
nginx
拦截HTTP
方法?
在配置拦截任何一种方法之前,需要了解401
、403
和405 HTTP
这几个响应代码之间差异,建议使用405
状态码:
- 1:
405 Method Not Allowe
表示服务端不允许使用当前类型HTTP
方法请求当前uri
- 2:
401 Unauthorized
表示当前用户未经认证授权,无权访问当前uri
- 3:
403 Forbidden
表示当前用户未通过鉴权,无权访问当前uri
在我看来,如果uri
不能用给定的HTTP
方法处理请求,它应该发送一个Allow
头来列出允许的HTTP
方法。 为此,您可以使用add_header
添加响应信息。
推荐配置
server {
...
# If we are in server context, it’s good to use construction like this:
add_header Allow "GET, HEAD, POST" always;
if ($request_method !~ ^(GET|HEAD|POST)$) {
# You can also use 'add_header' inside 'if' context:
# add_header Allow "GET, HEAD, POST" always;
return 405;
}
...
}