[proposal] SERVER_NAME в fastcgi_params

Maxim Dounin mdounin на mdounin.ru
Вт Мар 7 00:23:41 UTC 2023


Hello!

On Mon, Mar 06, 2023 at 05:17:34PM +0300, Evgeniy Berdnikov wrote:

> On Mon, Mar 06, 2023 at 02:22:25PM +0300, Andrey Kopeyko wrote:
> > On Mon, 6 Mar 2023, Nikolay Shaplov wrote:
> > > Я бы с этим всем согласился, приняв на веру, если бы в RFC не было бы
> > > написано:
> > > 
> > > The SERVER_NAME variable MUST be set to the name of the server host
> > > to which the client request is directed.
> > 
> > Вот это самое правило вы и нарушаете, в описанной вами конфигурации, - но
> > раз вам так надо и вы понимаете что вы делаете, то пускай.
> 
>  Товарищ, наверное, хотел сказать, что составитель дефолтной конфигурации
>  не заметил некоторые проблемы, с которыми могут столнуться пользователи.
>  И что если вместо $server_name написать $host, то вероятность возникновения
>  этих проблем будет несколько ниже. С чем трудно не согласиться.
> 
>  Как всегда, ждём, какие аргументы придумают авторы, чтобы ничего не менять. :)

Да вообще легко :))

Дефолтная конфигурация, по историческим причинам, заточена на 
конфигурации, где server_name задан: это было поведением по 
умолчанию до nginx версии 0.8.48.

Подобная конфигурация в целом предполагает, что запрашиваемое 
клиентом имя может использовать для выбора блока server{}, но в 
дальнейшем не используется: для всех остальных действий 
используется каноническое имя сервера.  Например, все 
перенаправления возвращаются с использованием канонического имени 
сервера (см. server_name_in_redirect).

Очевидно, что в подобной конфигурации SERVER_NAME, передаваемый в 
CGI-like бэкенды, тоже должен отражать каноническое имя сервера, 
то есть $server_name.  Замена его на $host приведёт к 
использованию в CGI-like бэкендах некорректного имени, 
использование которого не предполагается конфигурацией.  Более 
того, если речь идёт про сервер по умолчанию для данного 
слушающего сокета - то имя окажется полностью под контролем 
клиента, что может привести уже к проблемам безопасности, если на 
бэкенде что-либо завязано на проверку этого имени.

Суммируя вышеизложенное: замена $server_name на $host 
гарантировано сломает конфигурации, полагающиеся на существующее 
поведение с передачей на CGI-like бэкенды канонического имени 
сервера, и для корректной работы таких конфигураций потребуется 
менять $host на $server_name обратно.

Какие конфигурации приоритетнее - сложно сказать, но лично я бы 
рекомендовал указывать server_name всегда, а не полагаться на то, 
что nginx сможет обрабатывать любые имена.  Именно так, в 
частности, делает и конфигурация по умолчанию - там server_name 
явно указан.

-- 
Maxim Dounin
http://mdounin.ru/


Подробная информация о списке рассылки nginx-ru