Как Вы создаете “Псевдонимы” в Tomcat Apache?

Похоже, это уже поднято здесь: https://github.com/codecentric/spring-boot-admin/issues/804

10
задан Brian Tompsett - 汤莱恩 31 May 2015 в 12:25
поделиться

2 ответа

Я провел намного больше времени, исследуя это и нашел решение, которое решает случайное удаление файлов контекста. Я нашел эту выборку на веб-сайте Apache под разделом конфигурации хоста:

Можно вложить один или несколько элементов Контекста в этом элементе Хоста, каждый представляющий различное веб-приложение, связанное с этим виртуальным хостом.

Виртуальные хосты хранятся в файле server.xml, расположенном в CATALINA_HOME\conf. Tomcat прибывает настроенный с localhost как хост по умолчанию. Так, если мы добавляем содержание attachments.xml из первого сообщения, мы получаем следующее:

<Host name="localhost"  appBase="webapps"
    unpackWARs="true" autoDeploy="true"
    xmlValidation="false" xmlNamespaceAware="false">

    <Context path="/attachments"
             docBase="e:\uploads\attachments"
             reloadable="true"
             crossContext="true" />
</Host>

Это настолько близко, как можно добраться до определения псевдонимов, подобных серверу HTTP Apache, я думаю.

9
ответ дан 3 December 2019 в 20:44
поделиться

Существует несколько опций.

  1. Используйте Apache в качестве frontend, делегируя коту mod_jk или mod_proxy
  2. Обеспечьте сервлет загрузки в своем собственном приложении, служа требуемому файлу
  3. Сделайте каталог, что Вы хотите, чтобы кот поставил веб-приложение

у каждого есть некоторые недостатки и некоторые преимущества. Я сильно предпочитаю первое решение по нескольким причинам:

  • Мои главные причины относятся к unixoid системам, о которых Вы, очевидно, не говорите: Только корень может связать порты ниже, чем 1 024, например, 80. Для этого кот должен был бы работать как корень (я знаю, что существует механика, чтобы позволить пользователям связывать с низкими портами, но я никогда не добирался для использования их). Apache обычно запускается как корень, но отбрасывает эти полномочия, как только порт 80 связывается.
  • Apache, как говорят, намного лучше в обслуживании статических ресурсов, чем кот (я никогда не измерял его, но трудно верить обратному),
  • Вы, очевидно, знаете, как создать псевдонимы в апаче - это было бы тривиально, чтобы сделать так.

О сервлете загрузки:

Таким образом, у Вас был бы сервлет, служащий Вашим статическим ресурсам, которые Вы могли бы связать с URL "/загрузку /*" (например, в приложении, которое также обрабатывает загрузки файла), Вы получили бы:

  • Необходимо настроить каталог, где файлы хранятся только однажды
  • Если Вам нужны Вы, мог бы легко реализовать проверки разрешения (например, вход в систему, требуемый для загрузки)
  • Необходимо развернуть только одно абсолютно автономное приложение.
  • Сервлет загрузки тривиален - находят файл, устанавливают, это - имя и тип файла в потоке вывода, и передайте его потоком байт байтом, затем закройте поток вывода (убедиться обработать имена файлов нападения как "/download/../../../../etc/passwd" или "/download/C:/WINDOWS/someimportantfile.xxx"), например, при помощи java.io. Конструктор файла, который получает базовый каталог как отдельный параметр.

Третья опция имеет некоторые серьезные недостатки и открывает Вас для нападений, если Вы не проявляете специальную заботу о них:

  • Tomcat не вручает каталоги, но веб-приложения. Для этого "E:/upload/attachments" был бы нужен, по крайней мере, каталог под названием "СЕТЬ-INF", содержа "web.xml". Заботьтесь для не обеспечения доступа для записи к этому каталогу и файлу из веб-приложения загрузки. С этим условием Вы могли бы позволить коту вручить каталог.
  • Однако: Настройте содержавший web.xml для не обслуживания "*.jsp" в качестве jsp, иначе кот только поставил бы jsp файлы, но выполнил бы их. Вообразите кого-то загружающего "index.jsp" с <% System.exit(0); %> или более злонамеренное содержание.

Одна дополнительная мысль: Вам не нужно дополнительное crosscontext="true". Это подразумевало бы, что webapplication, который Вы развертываете только для обслуживания файлов, имеет доступ к другому webapplications, например, может управлять ими или получить доступ к их частным данным. Обычно Вам не нужно это вообще, в случае Вашего вопроса, Вы определенно не хотите это.

7
ответ дан 3 December 2019 в 20:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: