Относительная траектория Struts сглажена в 7.0.78, но не в 7.0.79, разрыв является Нормализованным - PullRequest
0 голосов
/ 30 января 2020

Мы возвращаем @Result из действия Struts 2 в приложении Spring Boot, которое указывает местоположение, содержащее относительный путь, чтобы сослаться на jsp в дочернем каталоге на root остальной части приложение.

@Result(name = "foo", location = "../../cat/bar.jsp")

Это работает в Tomcat 7.0.78, поступая в StrictHttpFirewall.getFirewalledRequest как:

ApplicationHttpRequest.requestURI = "rootParent/cat/bar.jsp"

В Tomcat 7.0.79+ это выравнивание больше не происходит и когда запрос достигает StrictHttpFirewall для проверки на нормализацию URL, он взрывается, потому что приходит как:

ApplicationHttpRequest.requestURI = "rootParent/root/WEB-INF/../../cat/bar.jsp"

Я просмотрел Apache 7 журнал изменений и исправления безопасности , чтобы увидеть, есть ли что-то, что может вызвать это, но ничего не может найти. Я пытался настроить свойство контекста useRelativeRedirects , но, похоже, оно не имеет никакого эффекта. Вытаскивая мои волосы, шагая через цепи фильтра в отладке. Любая помощь будет высоко ценится!

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

Я выяснил проблему и нашел решение.

Проблема в том, что этот коммит изменяет поведение org.apache.catalina.core.ApplicationContext.getRequestDispatcher между 7.0.78 и 7.0.79. Ранее указанный URL-адрес был нормализован перед добавлением в контекстный путь. В 7.0.79 и более поздних версиях нормализованная версия больше не используется.

Нет параметров, изменяющих это поведение, но я выяснил, как решить проблему, изменив местоположение, которое передает Struts. Когда запрос достигает ApplicationContext, Struts уже объединил контекст и URL в одно место, но мы можем переопределить часть контекста в аннотации Request. Он использует "WEB-INF/content/" + "%{url}" для всего остального, поэтому я изменил его на "%{url}".

До этого получалось «WEB-INF / content /../../ bar. jsp»

@Result(name = "foo", location = "../../bar.jsp")

После, в результате появляется "bar. jsp"

@Result(name = "foo", location = "bar.jsp", params = {"location", "%{url}"})
0 голосов
/ 30 января 2020

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

FooBar.class.getClassLoader().getResource('../../cat/bar.jsp')

...