我有以下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是否可以防止这种攻击?
答案 0 :(得分:1)
看起来nginx已经强制执行至少部分restrictions on valid host names,但如果你想确定,你可以随时使用nginx rewrite module来过滤主机名,如: / p>
if ($host !~ "^[a-z0-9\-]+([.][a-z0-9\-]+)+$") {
return 400;
}
这应该(假设我做对了;我自己实际上并没有使用nginx)返回400错误,除非主机名由两个或多个以句点分隔的段组成,每个段由一个或多个ASCII小写组成字母,数字或连字符。特别是,它应该拒绝任何主机名"包含斜杠或其他意外的标点符号(如反斜杠),以及以句点开头的任何主机名。
(请注意,此正则表达式将接受IPv4地址,但会拒绝IPv6地址。您可能希望单独处理这些情况,如果只是为了提供更好的错误消息。或者可能不是 - 没有人使用HTTP / 0.9更多。)