2016-11-24 72 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中進行改進/澄清