1

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

nginx400 Bad Request按预期返回。是否有任何其他方法可以规避这种情况,或者 nginx 是否可以防止这种攻击?

4

1 回答 1

1

看起来 nginx 至少已经对有效主机名实施了一些限制,但如果你想确定,你总是可以使用nginx rewrite 模块自己过滤主机名,如下所示:

if ($host !~ "^[a-z0-9\-]+([.][a-z0-9\-]+)+$") {
    return 400;
}

这应该(假设我做对了;我自己并没有实际使用过 nginx)返回 400 错误,除非主机名由两个或多个以句点分隔的段组成,每个段由一个或多个 ASCII 小写字母、数字或连字符组成. 特别是,它应该拒绝任何包含斜杠或其他意外标点符号(如反斜杠)的“主机名”,以及任何以句点开头的主机名。

(请注意,此正则表达式将接受 IPv4 地址,但会拒绝 IPv6 地址。如果只是为了提供更好的错误消息,您可能希望单独处理这些情况。或者可能不会——没有人再使用 HTTP/0.9。)

于 2014-05-13T13:52:22.333 回答