【问题标题】:How to distinguish between Known IP and unknown IP如何区分已知IP和未知IP
【发布时间】:2013-01-04 06:52:27
【问题描述】:

我需要开发一个可以识别已知机器和未知机器的 Web 应用程序,方法是在服务器端存储一对(源 IP,有效用户名),之前登录成功。当任何人从未知机器登录时如何识别。web应用程序托管在本地主机中。是否可以获得客户端 IP。当检索客户端 IP 时,我只得到 127.0.0.1,即 localhost。任何人有任何想法......?

【问题讨论】:

  • 如何获取客户端IP?

标签: java jakarta-ee ip


【解决方案1】:

简短的回答是您无法始终获得真实的客户端 IP 地址。

如果客户端有自己的 IP 地址并直接连接到服务器,那么HttpServletRequest.getRemoteAddr() 应该返回它。然而:

  • 如果客户端的请求通过代理或反向代理到达服务器,那么getRemoteAddr()将返回第一个上游代理地址。

  • 如果客户端将服务器地址设为localhost,则请求将来自本地主机。

  • 如果客户端位于 NAT 网关或 IPv4 IPv6 网桥后面,您可能会看到网关或网桥的 IP 地址。

那么就存在IP地址可能被欺骗的问题。

简而言之,依赖知道真实客户端 IP 地址的安全方案通常是有问题的。


如果您的问题是由反向代理引起的(并且看到 127.0.0.1 会暗示这一点),您可以让反向代理在请求中添加一个请求标头,以说明它看到的远程 IP 地址。然后服务器需要使用该标头而不是getRemoteAddr()。但是,如果代理没有看到真实的客户端 IP 地址,这将无济于事。

【讨论】:

    【解决方案2】:

    在 Servlet 中你可以这样做:

    public class GetAddress extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
            String ip = request.getRemoteAddr();
            // now you can check if the ip exists and if not store it or do other usefull stuff ...
        }
    }
    

    【讨论】:

    • 0:0:0:0:0:0:0:1 我得到的是代理地址而不是实际客户
    • 请求来自哪里?
    猜你喜欢
    • 2020-02-12
    • 2014-06-25
    • 2016-11-07
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多