nginx-0.7.15

Maxim Dounin mdounin at mdounin.ru
Wed Sep 10 15:19:53 MSD 2008


Hello!

On Wed, Sep 10, 2008 at 09:21:15AM +0400, Igor Sysoev wrote:

>On Tue, Sep 09, 2008 at 11:31:13PM +0400, Maxim Dounin wrote:
>
>> On Mon, Sep 08, 2008 at 12:40:29PM +0400, Igor Sysoev wrote:
>> 
>> >Изменения в nginx 0.7.15                                          
>> >08.09.2008
>> 
>> [...]
>> 
>> >   *) Добавление: теперь nginx разрешает подчёркивания в именах строк в 
>> >      заголовке запроса клиента.
>> 
>> BTW, в результате конструкция вида
>> 
>>      proxy_set_header  X-Permit-Something  "OK";
>> 
>> (где OK или нет определяется скажем из ip-адреса клиента) с 
>> последующей проверкой на бекенде в cgi-скрипте под Apache 
>> как-нибудь вроде
>> 
>>      if ($ENV{HTTP_X_PERMIT_SOMETHING} eq 'OK') {
>>          ...
>>      }
>> 
>> становится небезопасной, т.к. клиент может передать заголовок 
>> X_Permit_Something ('_' вместо '-'), этот заголовок не будет убран 
>> nginx'ом из запроса и в запросе к Apache будет стоять после 
>> заголовка X-Permit-Something, добавленного nginx'ом.  Apache в 
>> свою очередь в переменную окружения HTTP_X_PERMIT_SOMETHING 
>> поместит именно последний пришедший в запросе заголовок (т.е. 
>> заголовок от клиента).
>
>Хуже того. Можно послать X_Real_IP.

Я в курсе, ага. Но сам nginx его не примет afaik, про apache с 
mod_realip/mod_rpaf - не уверен (не проверял). А вот всякие 
скрипты, использующие его напрямую - примут точно, и я таких знаю.

> В общем, именно из-за таких
>неоднозначностей я и не хотел долгое время разрешать подчёркивание
>в заголовках, которое позволяется RFCом.

Я помню, и честно говоря был очень удивлён что ты вдруг его 
разрешил, даже не попытавшись затронуть соответствующих вопросов. Посему 
и полез смотреть внимательно.
:)

>Наверное, нужно сделать это настраиваемым - хочешь подчёркивания -
>будь готов к сюрпризам.

Можно и так.  E.g. превратить ignore_invalid_headers в enum, чтобы 
можно было выбрать "пропускать стандартные заголовки", не 
пропуская при этом откровенный мусор.

>> Т.е. надо явно в конфигурации ещё и говорить
>> 
>>      proxy_set_header X_Permit_Something "";
>>      proxy_set_header X-Permit_Something "";
>>      proxy_set_header X_Permit-Something "";
>> 
>> Возможно имеет смысл такие заголовки убирать автоматически.
>
>Автоматически это делать накладно - нужно тупо проверять все заголовки
>со всеми. Вышеприведённый вариант будет работать куда быстрее.

Ну зачем же.  Для соответствующего хеша сделать специальное 
case-insensitive сравнение, которое считает '-' и '_' одним 
символом - и всё.  Хотя по здравому размышлению идея настройки мне 
мне всё-таки нравится больше, да и сделать проще.

Maxim Dounin





More information about the nginx-ru mailing list