【问题标题】:unable to read the original url when host is specified指定主机时无法读取原始网址
【发布时间】:2021-06-10 01:43:11
【问题描述】:

我的代码在本地主机上运行,​​我正在点击我的网址之一,如下所示

curl -k -vv --http1.1 "https://localhost:8443/versa/login" -H 'Host: google.com'

现在我正在尝试使用以下代码读取我的代码中的网址

StringBuffer url = httpServletRequest.getRequestURL();

无论使用的协议是HTTP/1.1 还是HTTP/2,该值始终如下所示

https://google.com/versa/login

这里如何阅读原文网址?

【问题讨论】:

    标签: java spring http2


    【解决方案1】:

    你不能。看看 curl 的输出 - 它应该提供线索 [我将 HTTPS 丢弃到 HTTP 以简化但 HTTPS 相同,只是从 CURL 进行更多调试]

    * TCP_NODELAY set
    * Connected to localhost (127.0.0.1) port 8443 (#0)
    > GET /versa/login HTTP/1.1
    > Host: google.com
    > User-Agent: curl/7.64.1
    > Accept: */*
    

    前两行只是调试。接下来的 4 是发送到服务器的内容.. 什么都看不到端口或 localhost ..

    【讨论】:

    • 谢谢R先生,如果我无法确定我的源主机,你能建议我如何解决主机头攻击吗?
    • 首先,它本身并不是攻击...假设您有多个网站链接到同一个 IP,请求需要完整描述它所指的内容 - 所以如果您有 foo.com 和 @987654323 @ 在同一个 IP 上然后来自浏览器的请求将根据 URI 和主机而有所不同,但都将通过相同的 IP/端口(默认情况下)进入
    • 在生产系统中-您将使用其他东西作为Java的前端-nginx,apache等。例如,在apache中,您定义虚拟主机以及它们接受的流量-其他任何东西被拒绝。您定义了希望在 Java 引擎中结束的 URI,它只需要处理它擅长的事情(运行代码),而不是处理所有其他事情——缓存、代理、提供其他内容等。跨度>
    • 现在在生产 HTTPS 世界中,您使用证书来验证服务器和潜在的客户端。在这种情况下,通道在发送任何内容之前都经过身份验证 - 因此,如果您可以确定通道经过身份验证的证书,那么也许您可以检测到主机案例...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 2014-08-04
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多