【问题标题】:Embedded Jetty replacing suburl嵌入式 Jetty 替换子网址
【发布时间】:2016-11-28 22:25:45
【问题描述】:

您好,我正在提供带有嵌入式 Jetty 的 HTTP 服务器

由于某种原因,必须使用包含点的子网址来接收某些请求。 示例:http://127.0.0.1:10000/./test/

但是当我从码头检索子网址时,点会自动替换。

有什么办法可以停止替换?

谢谢 杰

【问题讨论】:

    标签: embedded-jetty


    【解决方案1】:

    这是 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 -> ??

    Jetty 目前将其规范化为 /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 中得到完善/澄清

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2016-02-22
      • 2015-09-29
      • 1970-01-01
      • 2021-08-16
      • 1970-01-01
      相关资源
      最近更新 更多