2013-10-24 46 views
9

Apache Tomcat(至少在Tomcat 6 参见脚注之前)在URI路径中处理百分比编码的斜杠(%2F),就像常规斜线(即作为路径分隔符)一样。为什么Apache Tomcat将编码斜线(%2F)作为路径分隔符处理?

因此,例如,的Tomcat的servlet实例页面可以在

  • http://localhost:8080/examples/servlets/进行访问,并在
  • http://localhost:8080/examples%2Fservlets/

这是没有道理给我。编码一个保留字符(如“/”)的百分点是为了避免它被视为保留字符(在本例中为路径分隔符)。除此之外,此行为是(一)导致的漏洞CVE-2007-0450。不过,我认为这肯定是有原因的。

  • 是否有任何技术上的原因,为什么Tomcat将%2F作为路径分隔符处理(ok,用于处理)?

  • 有没有这种行为有帮助的情况?


脚注:我认识到,由于CVE-2007-0450 Tomcat的默认行为已更改拒绝路径百分比编码的斜杠。但是,如果该检查被禁用(ALLOW_ENCODED_SLASH),则旧行为仍然存在。

回答

8

这与Tomcat在httpd反向代理之后有关。在某些情况下,URI被部分编码,所以%2F处理是撤销该编码所必需的。

它创建了一些安全问题,这些问题在CVE-2007-0450的同一时间已修复。有关背景信息,请参阅mod_jk文档中的ForwardURIxxx选项:http://tomcat.apache.org/connectors-doc/reference/apache.html这涵盖了一些您仍可能需要此功能的情况(但由于可能存在的安全问题,如果可能的话,我会尽量避免)。

默认行为现在是httpd,将URI传递给Tomcat,并且将Tomcat传递给对应的编码字符。

+0

马克,有没有办法告诉Tomcat *不*将%2F作为路径分隔符?我意识到它会完全拒绝这个请求,除非在这里提到的这个prop被设置,但是在那之后,我想把“.../foo%2Fbar/...”当作一个值为“foo/bar”的路径元素,并且不是好像它是“.../foo/bar/...” –

+0

恐怕不是。 %解码发生在相当早的时间,并且一旦解码发生,Tomcat就无法区分原始/和从%2F解码后的差异。你也许能够使用双重编码,即%252F,但我不会推荐它,因为这是过去导致安全问题的事情。 –

+2

我对Tomcat 7做了一些测试,发现它不接受URL路径中的%2F:它返回HTTP状态码400“错误请求”。如果我在参数中传递%2F可以正常工作。如果我在URI中使用%2C将被转换为',',所以Tomcat确实以特殊方式处理%2F。 –

相关问题