【问题标题】:Can I validate the domain name of HTTP request?我可以验证 HTTP 请求的域名吗?
【发布时间】:2018-01-22 12:55:24
【问题描述】:

我有一个带有单个入口点 URL 的 Java Web 应用程序,并且一个外部 Web 应用程序重定向到该 URL。我可以在服务器端使用 cookie 或其他方式检查请求是否来自特定域?

编辑: 我无法更改外部应用代码

【问题讨论】:

  • 您能否更改外部服务器重定向到您的 Java Web 应用程序的方式?我的意思是代码,还是网址?

标签: java http cookies


【解决方案1】:

我认为您想知道 HTTP Referer(“调用”您的页面的 URL):

String referrer = request.getHeader("referer");

编辑

我忘记了,正如 gustafc 所说,HTTP 引荐来源网址是客户端控制的值,可以被完全不同的东西欺骗甚至被客户端删除,所以你不能确定你的 HTTP Referrer 不是假值

【讨论】:

    【解决方案2】:

    您可以查看HTTP referer,但它不可靠:它很容易伪造,并且有些人出于隐私原因选择禁用推荐人。因此,虽然它可能在大多数情况下都有效,但不要依赖它来解决安全或其他基本问题。

    尝试这样做的真正原因是什么?

    【讨论】:

    • 主要原因是安全性。事实上,请求中有一个加密的密钥,这已经足够了,但我需要额外检查域名。
    • 你可以尝试发起一个 dns 请求,看看结果是否与 HTTP 引用者匹配。
    • @DmitryTikhonov 您是在尝试验证用户是否通过点击其他网站的方式到达您的网站,还是在尝试验证用户的请求是否来自某个域(即,基本上检查用户的IP)?我只是假设前者,这是不可能的(而且恕我直言毫无用处);正如其他海报所描述的,后者是非常可行的。
    【解决方案3】:

    是的。您可以通过请求对象中的getRemoteHost()getRemoteAddr() 方法获取请求的来源。

    http://docs.oracle.com/javaee/5/api/javax/servlet/ServletRequest.html#getRemoteHost()

    【讨论】:

    • 对我来说不是一个合适的解决方案,因为getRemoteHost() 返回最后一个代理,而不是重定向发起者
    • 一些代理将原始客户端 IP 作为标头传递。例如。 Apache mod_proxy 使用X-Forwarded-For
    【解决方案4】:

    如果您只需要验证请求是否来自特定 IP(或 IP 范围),您可以在防火墙上配置一条规则来支持这一点(假设代理在防火墙内。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-18
      • 2018-11-18
      • 1970-01-01
      • 1970-01-01
      • 2015-06-28
      • 1970-01-01
      • 2017-10-05
      • 1970-01-01
      相关资源
      最近更新 更多