温馨提示:本文翻译自stackoverflow.com,查看原文请点击:java - Struts relative path flattened in 7.0.78 but not in 7.0.79, breaking isNormalized
java spring struts2 tomcat tomcat7

java - Struts相对路径在7.0.78中变平了,但在7.0.79中没有变平,打破了isNormalized

发布于 2020-04-18 21:04:51

我们从Spring Boot应用程序的Struts 2操作返回一个@Result,该操作指定一个包含相对路径的位置,以便将同级目录中的jsp引用到应用程序其余部分的根目录。

@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 changelog安全修复程序,以查看是否有任何可能导致这种情况发生的事情,但找不到任何东西。我已经尝试过调整useRelativeRedirects Context属性,但是它似乎没有任何作用。在调试过程中,将我的头发拉出来,逐步通过过滤器链。任何帮助将非常感激!

查看更多

提问者
Alex Pritchard
被浏览
54
Alex Pritchard 2020-02-05 01:05

我找出问题所在,找到了解决方案。

问题在于此提交更改了org.apache.catalina.core.ApplicationContext.getRequestDispatcher7.0.78和7.0.79之间的行为以前,提供的URL在附加到上下文路径之前已被规范化。在7.0.79及更高版本中,不再使用标准化版本。

没有设置可以更改此行为,但是我想出了如何通过修改Struts传入的位置来解决问题的方法。当请求到达ApplicationContext时,Struts已经将上下文和url合并到一个位置,但是我们可以覆盖Request批注中的上下文部分。"WEB-INF/content/" + "%{url}"用于其他所有内容,因此我将其更改为just "%{url}"

之前,结果为“ WEB-INF / content /../../ bar.jsp”

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

之后,结果为“ bar.jsp”

@Result(name = "foo", location = "bar.jsp", params = {"location", "%{url}"})