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