2016-11-24 86 views

回答

0

这是没有很好地界定Servlet规范的一个阴暗的角落(并具有had discussion on the servlet spec experts group mailing list,最近的2个月前!)

的规范说的传入的URL必须在与contextPath或urlPattern进行匹配之前被“标准化”。

一个URI/URL的标准化是为一些原因而作出的(规范要求,安全性,防止情况下,清理目录遍历的外部访问,正确运用的限制,等等。)

事情是标准化(假设在/foo/bar 3个部署上下文和/):

  • /foo - >/foo/
  • /foo/../bar/ - >/bar/
  • /foo/../../../etc/passwd - >/etc/passwd
  • /foo/css//main.css - >/foo/css/main.css
  • /foo/app/./css/./widget.css - >/foo/app/css/widget.css

然后取这个怪物......

  • /foo/context/.//..%2F..//./%62%61%72/context/servlet/info - > ??

码头目前正常化下来到/bar/context/servlet/info,但Servlet规范(Servlet规范实施者之间一个非常不受欢迎的诠释!)的严格解释说,它应该:

  • 比赛上/foo背景
  • getContextPath()返回/foo/context/.//..%2F..//./%62%61%72/context/servlet/info
  • getPathInfo()返回/context/.//..%2F..//./%62%61%72/context/servlet/info

该规范的这个丑陋的部分对安全性工作非常敌视,并且可能会在Servlet 4.0中进行改进/澄清