nginx $host变量是否包含斜杠?



我有以下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了

最新更新