【发布时间】:2019-10-24 15:16:00
【问题描述】:
我正在 Karaf 构建一个 Java 网络服务器。我想知道http调用是否来自同一台机器(=是本地的)。到目前为止,像 Referer 和 Host 这样的 Http 标头在这方面对我有帮助。
策略就是看header中出现的URL是否为localhost。
这种方法有什么危险?还有更安全的方法吗?
【问题讨论】:
-
一个有趣的子问题是确定是否可以欺骗这些标头,以及是否有更安全的方法来获取这些信息。
-
您不能依赖 HTTP 标头,因为客户端可以发送它想要的任何标头,包括伪造的标头。 Host 标头仅命名服务器的域名,不提供有关客户端的任何信息。同样,Referer 是一个可选字段,指示先前访问的页面,并且不提供有关客户端的信息。相反,您需要查看来自底层 TCP 连接的远程地址。使用 JavaEE ServletRequest,尝试
getRemoteAddr()方法。它应该匹配服务器的任何 IP 地址,可能是环回地址 127.0.01 (IPv4) 或 ::1 (IPv6)。