Может ли переменная 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 защищает от такого рода атак?

1 ответ

Решение

Похоже, что nginx уже применяет по крайней мере некоторые ограничения на допустимые имена хостов, но если вы хотите быть уверены, вы всегда можете использовать модуль перезаписи nginx для фильтрации имен хостов самостоятельно, как в:

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

Это должно (при условии, что я понял это правильно; я на самом деле не использовал nginx сам) вернуть ошибку 400, если имя хоста не состоит из двух или более сегментов, разделенных точками, причем каждый сегмент состоит из одной или нескольких строчных букв ASCII, цифр или дефисов, В частности, он должен отклонять любые "имена хостов", содержащие косую черту или другие неожиданные знаки препинания (например, обратную косую черту), а также любые имена хостов, начинающиеся с точки.

(Обратите внимание, что это регулярное выражение будет принимать адреса IPv4, но отклоняет адреса IPv6. Возможно, вы захотите обрабатывать эти случаи отдельно, хотя бы для того, чтобы предоставить более качественное сообщение об ошибке. Или, возможно, нет - никто больше не использует HTTP/0.9.)

Другие вопросы по тегам