【问题标题】:Detect local clients reliably, server side可靠地检测本地客户端,服务器端
【发布时间】:2019-10-24 15:16:00
【问题描述】:

我正在 Karaf 构建一个 Java 网络服务器。我想知道http调用是否来自同一台机器(=是本地的)。到目前为止,像 RefererHost 这样的 Http 标头在这方面对我有帮助。

策略就是看header中出现的URL是否为localhost

这种方法有什么危险?还有更安全的方法吗?

【问题讨论】:

  • 一个有趣的子问题是确定是否可以欺骗这些标头,以及是否有更安全的方法来获取这些信息。
  • 不能依赖 HTTP 标头,因为客户端可以发送它想要的任何标头,包括伪造的标头。 Host 标头仅命名服务器的域名,不提供有关客户端的任何信息。同样,Referer 是一个可选字段,指示先前访问的页面,并且不提供有关客户端的信息。相反,您需要查看来自底层 TCP 连接的远程地址。使用 JavaEE ServletRequest,尝试 getRemoteAddr() 方法。它应该匹配服务器的任何 IP 地址,可能是环回地址 127.0.01 (IPv4) 或 ::1 (IPv6)。

标签: jakarta-ee apache-karaf


【解决方案1】:

正如amon 在他的评论中指出的那样,可靠的方法是使用 javax.servlet.http.HttpServletRequest.

import javax.ws.rs.core.Context;
import javax.servlet.http.HttpServletRequest; 

使用 Context 注释将 HttpServletRequest 注入您的代码:

@Context private HttpServletRequest req;

然后使用对象从两者之一中获取地址:

LOG.info("{}", req.getRemoteHost());
LOG.info("{}", req.getRemoteAddr());

This 的回答帮助我了解了细节。

【讨论】:

    猜你喜欢
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多