为什么 Apache Tomcat 将编码的斜杠 (%2F) 作为路径分隔符处理



Apache Tomcat(至少在Tomcat 6之前见脚注)将URI路径中的百分比编码斜杠(%2F)视为常规斜杠(即作为路径分隔符)。

因此,例如Tomcat的servlets示例页面可以在以下位置访问:

  • http://localhost:8080/examples/servlets/和在
  • http://localhost:8080/examples%2Fservlets/

这对我来说没有意义。对保留字符(如"/")进行百分比编码的全部意义在于避免将其视为保留字符(在本例中为路径分隔符)。除此之外,此行为是漏洞 CVE-2007-0450 的(一个)原因。但是,我认为一定是有原因的。

  • Tomcat 将(好的,用于处理)%2F 视为路径分隔符有什么技术原因吗?

  • 在某些情况下,这种行为是否有帮助?


脚注:我意识到由于 CVE-2007-0450,Tomcat 的默认行为已更改为拒绝路径中的百分比编码斜杠。但是,如果禁用此检查 (ALLOW_ENCODED_SLASH),则旧行为将保留。

这与Tomcat在httpd反向代理后面的时间有关。在某些情况下,URI 已部分编码,因此必须使用 %2F 处理来撤消该编码。

它产生了许多安全问题,这些问题在修复CVE-2007-0450的同时得到修复。有关背景信息,请查看mod_jk文档中的 ForwardURIxxx 选项: http://tomcat.apache.org/connectors-doc/reference/apache.html 这涵盖了您可能仍然需要此功能的几种情况(但由于可能存在的安全问题,如果可能的话,我会避免使用它)。

默认行为现在是httpd,以将URI传递给Tomcat不变,并且Tomcat将编码字符视为完全相同。

最新更新