Назад | Перейти на главную страницу

debian nginx 1.10.3 предотвращает внедрение заголовков

У меня есть debian 8 VPS, работающий с nginx 1.10.3.

Я размещаю несколько веб-сайтов на Symfony 3.2 (использую php7-fpm) и сталкиваюсь с проблемами внедрения заголовков. Я не могу понять, связана ли проблема с nginx или с конфигурацией проекта Symfony.

Я сейчас не использую LoadBalancer, например Varnish или Amazon AWS.

Когда кто-то отправляет запрос с недействительным X-Forwared-Host Такие как :

X-Forwarded-Host: pg_sleep(2)

Затем он получает 500 Internal Server Error, и я вижу в логах критическую ошибку:

UnexpectedValueException: "Invalid Host "pg_sleep(2)" at [...]/var/bootstrap.php.cache"

Я могу легко воспроизвести его (только в производственной среде, используя этот файл bootstrap.php.cache) с помощью curl:

curl -I\
 -H "X-Forwarded-Host: pg_sleep(2)"\
 "https://my-domain.tld"

Некоторые другие ценности, которые я получил, могут быть X-Forwarded-Host: *.domain.tld, X-Forwarded-Host: -1 or 2+429-429-1=0+0+0+1 --, X-Forwarded-Host: -1; waitfor delay '0:0:14' -- и т.п.

Я похож на укол.

Моя цель - обработать такие недопустимые заголовки и вернуть, например, статус 444 или, по крайней мере, предотвратить запуск приложения. 500 Internal Server Error.

Мой первый вопрос: следует ли мне пытаться перехватывать такие недопустимые заголовки внутри конфигурации nginx (используя модуль?) Или это то, что должно обрабатываться проектом symfony вместо этого?

Я прочитал это руководство: http://symfony.com/doc/current/components/http_foundation/trusting_proxies.html

Вы также должны убедиться, что ваш прокси-сервер фильтрует несанкционированное использование этих заголовков, например если прокси-сервер изначально использует заголовок X-Forwarded-For, он не должен позволять клиентам отправлять Forwarded-заголовки в Symfony.

Это заставляет меня думать, что этим должен заниматься nginx, тогда ... Как?

Я попытался проверить хост внутри своего блока server {}, но он его не перехватывает ...

server {
    listen 443;

    # [...]

    if ($host !~ ^(my-domain.tld)$ ) {
        return 444;
    }

    # [...]
}

Похоже, можно было бы использовать headers_more модуль, но это лучшая практика?

https://www.nginx.com/resources/wiki/modules/headers_more/