我有以下nginx配置:
server
{
listen 80 default;
listen [::]:80 default_server ipv6only=on;
server_name _;
root /home/user/websites/$host;
index index.html;
}
这简化了配置(根据我的需要),如果我想要服务一个新域或子域,我只需创建文件夹/home/user/websites/sub.domain.tld/
。
我的问题是,在这种设置下,恶意用户是否有可能发送错误的Host
头,并遍历目录结构?
我已经试过了:
$ curl --header "Host: ../testing" ip.address
nginx按预期返回400 Bad Request
。是否有其他方法可以规避这种攻击,或者nginx可以防止这种攻击?
看起来nginx已经强制执行了至少一些对有效主机名的限制,但是如果你想要确定,你总是可以使用nginx重写模块自己过滤主机名,如:
if ($host !~ "^[a-z0-9-]+([.][a-z0-9-]+)+$") {
return 400;
}
这应该(假设我没弄错;我自己没有实际使用过nginx)返回400错误,除非主机名由两个或多个由句号分隔的段组成,每个段由一个或多个ASCII小写字母,数字或连字符组成。特别是,它应该拒绝任何包含斜杠或其他意想不到的标点符号(如反斜杠)的"主机名",以及任何以句号开头的主机名。
(注意这个regexp将接受IPv4地址,但将拒绝IPv6地址。如果只是为了提供更好的错误消息,您可能希望单独处理这些情况。也可能不是—没有人再使用HTTP/0.9了