Tomcat, обслуживающий статический контент - PullRequest
5 голосов
/ 29 сентября 2010

У меня есть приложение Spring, и мне интересно, как лучше всего использовать статический контент.Я пробовал следующее:

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/static/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>app</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

Это работает, но поведение DefaultServlet означает, что любой запрос формы /static/PATH обслуживает файл из webapp/PATH.Это открывает огромную уязвимость, позволяя показывать конфиденциальную информацию с помощью таких URL-адресов, как: http://localhost/app/static/META-INF/context.xml

Какое общее решение для этого?Должен ли я переместить конфиденциальные файлы?Написать свой собственный DefaultServlet?Или есть лучший способ обслуживания статического контента?

Ответы [ 3 ]

15 голосов
/ 29 сентября 2010

Вы проверяли это?Папки /META-INF и /WEB-INF должны быть общедоступными недоступными в соответствии со спецификацией сервлета.Клиент должен был получить 404 за это.В противном случае это была бы ошибка в DefaultServlet.

Вот выдержка из Servlet 2.5 spec :

Структура каталогов SRV.9.5

... Кроме того, любые запросы от клиента на доступ к ресурсам в каталоге WEB-INF/ должны быть возвращены с ответом SC_NOT_FOUND(404).

и

SRV.9.6 Файл архива веб-приложения

... Кроме того, любые запросы на доступ к ресурсам в каталоге META-INF должны возвращаться с ответом SC_NOT_FOUND(404).


Обновление : ОК, я забираю свои слова обратно.Я могу воспроизвести это на последних Tomcat 6 и 7. Это определенно ошибка в DefaultServlet.Он работает нормально (возвращает 404) на Glassfish 3.0.1.


Обновление 2: Я сообщал об этом парням Tomcat как выпуск 50026 .


Обновление3: один из парней из Tomcat ответил:

Я думаю, что это WONTFIX.

Механизм сервлета защищает WEB-INF и META-INF пути в веб-приложении (которое работает нормально), а не файлы с таким именем по произвольным путям.

На самом деле здесь вы настраиваете сервлет, обслуживающий файлы общего назначения, для монтирования всего веб-приложения.по другому пути - это эквивалентно настройке Apache для того же.За исключением того, что DefaultServlet не является файловым сервером общего назначения - он предназначен для сопоставления с /, и вы не можете настроить его на выполнение каких-либо действий, кроме обслуживания файлов из каталога веб-приложения.

I 'Я предполагаю, что вы пытаетесь обойти проблему, связанную с отображением другого сервлета в /*, который в основном пытается обойти работу механизма сервлета. Как получить доступ к статическим ресурсам при отображении сервлета глобального фронт-контроллера в / * есть пример лучшего подхода к вещам, если вы пытаетесь это сделать.

Советы по перемонтированию DefaultServlet в Tomcat, похоже, существовали до тех пор, пока существует Tomcat, поэтому, возможно, нам нужно заблокировать его (чтобы люди не могли случайно создать небезопасные конфигурации) или поддержать монтирование определенных каталогов (внутриили вне веб-приложения) и прерываются при доступе к корневым ресурсам при сопоставлении с подпутем в любом случае.


Обновление 4: они в конечном итогеисправили это:

Исправления для DefaultServlet и WebdavServlet зафиксированы для 7.0.x (будет в 7.0.4+) и предложены для 6.0.x.Нужно будет проверить 5.5.x и посмотреть, нужен ли для этого бэкпорт.

11 голосов
/ 29 сентября 2010

Существует несколько лучших способов обслуживания статического контента.

Традиционный подход заключался в использовании UrlRewriteFilter для переназначения URL-адресов следующим образом:

web.xml:

<filter>
    <filter-name>UrlRewriteFilter</filter-name>
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>UrlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
...
<servlet-mapping>
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
    <url-pattern>/app/*</url-pattern>
</servlet-mapping>

urlrewrite.xml:

<urlrewrite default-match-type="wildcard">
    <rule>
        <from>/images/**</from>
        <to>/images/$1</to>
    </rule>
    <rule>
        <from>/scripts/**</from>
        <to>/scripts/$1</to>
    </rule>
    <rule>
        <from>/styles/**</from>
        <to>/styles/$1</to>
    </rule>
    <rule>
        <from>/**</from>
        <to>/app/$1</to>
    </rule>
</urlrewrite>

Этот подход можно увидеть в большинстве весенних образцов.


Spring 3.0.1 представил более новое приложение - он может обслуживать статический контент через DispatcherServlet.Его можно настроить с помощью элемента <mvc:resource> в конфигурационном файле Spring.В Spring 3.0.4 он был расширен за счет поддержки нескольких параметров управления местоположением и кэшем, см. 15.12.4 mvc: resources .
1 голос
/ 29 сентября 2010

WEB-INF и META-INF являются личными папками. Клиент должен получить ошибку 404 для этого. Поскольку META_INF содержимое не доступно напрямую. В противном случае переместите все конфиденциальные файлы в WEB_INF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...