nginx-1.3.1

Maxim Dounin mdounin at mdounin.ru
Mon Sep 17 17:22:40 UTC 2012


Hello!

On Mon, Sep 17, 2012 at 11:19:02AM -0400, ruv wrote:

> День добрый!
> 
> > > >     *) Безопасность: теперь nginx/Windows игнорирует точку в конце
> > > >        компонента URI и не разрешает URI, содержащие
> > > > последовательность ":$".
> > 
> > Да, это связано именно с этим изменением.  Под windows точка в 
> > конце любого имени файла/каталога - не значащая, и такие uri нужно 
> > либо отвергать, либо нормализовывать.  В противном случае имеем 
> > возможность обхода ограничений доступа.  До 1.3.1 делалось 
> > нормализация только для последнего компонента пути, сейчас - для 
> > всех.
> 
> Дело еще в том, что ведь далеко не каждый URI отображается на файловую
> систему.
> Поэтому, я думаю, при передаче бэкенду допустимо проводить нормализацию
> только если специально указано в конфиге (как например merge_slashes).
> Понимаю, тут возникает трудность в реализации. В location ведь сейчас
> сопоставляется нормализованный URI.  Может быть тогда эту нормализацию тоже
> опцией отключать (будет полная аналогия merge_slashes)?

Нормализовывать (или отвергать) необходимо по умолчанию, ибо в 
противном случае конфигурация вида

    location /admin/ {
        auth_basic ...
    }

на виндах превращается в фикцию.  В частности - при передаче 
запросов бекенду, т.к. типичный бекенд (читай: php) открыват файлы 
без каких-либо дополнительных проверок.

Сделать нормализацию отключаемой, снабдив надписью "берегись 
леопарда" (a la merge_slashes), - можно, но не факт, что нужно.  
Особенно с учётом того, что отключать это можно только для всех 
виртуальных хостов на паре ip:port разом.

> > Если нужно проксировать без нормализации uri (в предположении, что 
> > бекенд сам справится с этой проблемой, и/или он не на виндах) - 
> > должно помочь написание директивы proxy_pass без URI, i.e.
> > 
> >     proxy_pass http://backend;
> > 
> > без "/" в конце.
> 
> Но, в таком случае не подменяется часть URI запроса, соответствующая
> location.  И тоже получается несовместимость — придется править код на
> бэкендах, появится лишняя связаность и зависимость...

Ну как мнимум два пути решения проблемы очевидны: отказаться от 
trailing dots или использовать proxy_pass без URI.  И я совершенно 
не уверен, что изобретать третий, притом не безопасный путь - это 
хорошая идея.

Maxim Dounin



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