【问题标题】:Is it possible to accurately determine the IP address of a client in java servletjava servlet中是否可以准确确定客户端的IP地址
【发布时间】:2012-02-17 09:56:30
【问题描述】:

我想在我的网络中配置一台机器以接受来自特定机器的所有呼叫而无需身份验证。为此,我计划使用客户端计算机的 IP 地址作为允许未经检查的身份验证所需的信任因素。

我担心的是,是否可以在 java servlet 中准确确定客户端的 IP 地址?是否有可能通过某种黑客机制更改我在 servlet 中获得的 IP,以使我的服务器相信它是受信任的 IP?

例如,如果我的服务器机器被配置为信任 192.168.0.1,那么 192.168.0.1 以外的其他客户端是否有可能伪装成 192.168.0.1 并欺骗我的身份验证机制?

【问题讨论】:

    标签: java authentication networking ip


    【解决方案1】:

    您可以使用HttpServletRequest 类中的getRemoteAddr() 方法来获取IP 地址。不过要小心。如果您的客户端位于代理服务器(甚至是 NATting 防火墙)之后,您将获得代理 IP 地址。

    因此,您还可以查找 X-Forwarded-For HTTP 标头(用于识别 HTTP 代理后面的客户端源 IP 地址的标准)。在Wikipedia 上查看更多信息。不过要小心。如果您的客户端不在代理后面,您可以获得一个空 XFF 标头。因此,如果您要遵循这条路径,您应该混合使用 servlet 方法和 XFF 标头评估。但是,不能保证代理会将标头转发给您。

    但请注意,任何恶意客户端都可以轻松更改或伪造源 IP 地址。我真的建议使用某种客户端身份验证(例如证书)。 Web 应用无法准确确定客户端 IP 地址。

    【讨论】:

    • 和 +1 用于提及 XFF 标头及其为空的可能性
    • 客户端身份验证如何工作?客户端是否可以发送类似于服务器在 https 通信中发送的证书来标识自己,您能否提供一些详细信息。
    • 您可以生成自签名客户端证书并将其安装在客户端计算机的密钥库中(您是否也在客户端中使用 Java?)。然后,您的服务器应该只接受来自给定 CA(在本例中为您自己)的客户端证书签名的请求。网上有很多关于 Java + 客户端证书的文档。另外,请查看 TLS 上出色的 Wikipedia entry 以了解基础知识。
    【解决方案2】:

    您的服务可能容易受到IP Spoofing 的攻击。伪造看似来自不同 IP 地址的数据包很容易。然而,关于欺骗的事情是攻击者将无法接收任何响应数据包。因此,如果调用您的服务不会导致内部状态更改(即它是只读),那么您应该没问题。但是,如果对您的服务的调用会发出 writes,那么您不应该仅仅依赖 IP 地址,因为欺骗数据包足以改变系统的内部状态。

    【讨论】:

    • 您能否提供一些方法来说明我如何实现所需的功能,即信任我网络中的机器。
    • 您可能想要做的部分事情是确定可接受的风险水平,并与您必须锁定的周期数相平衡。如果你是一家银行,那么你需要确保它坚如磐石,但其他应用程序有更多的容忍度。一种选择是确保您没有绑定公共 IP 并信任您的系统管理员以保持本地网络锁定。如果你真的需要保护它,如果你需要锁定它,viccaris 建议使用客户端证书是一个很好的建议。无论您做什么,如果您超出 IP 验证范围,请确保您可以轻松撤消访问权限。
    【解决方案3】:

    您可能在本地对ARP Spoofing 很敏感。恶意机器诱使路由器将 IP 地址与其 MAC 地址相关联。

    信任的级别和机制实际上取决于您尝试保护的服务器/服务的敏感性以及您所运行的环境。

    在我看来,这是给定私有 IP 地址 192.168 范围的本地安排。如果此服务器不是面向公众的,不是关键的,并且您在相对安全的 LAN 环境中运行,该环境很好地与公共和其他私有 LAN 隔离,那么您应该没问题。否则,您应该查看更高级别的其他安全选项。

    【讨论】:

    • 好点。我还没有(还)花太多时间担心本地网络上的恶意用户,尽管它肯定会发生并且是防止的好主意。 :)
    • 192.168 ip范围不会被任何公共路由器携带。所以任何威胁都必须来自内部
    【解决方案4】:

    我担心的是,是否可以在 java servlet 中准确确定客户端的 IP 地址?

    不,这是不可能的。在许多情况下,由于用户的操作或用户无法控制的其他原因,您将看不到真实的客户端 IP 地址。

    在后一种情况下,基于 IP 的识别最终会让您的诚实客户感到头疼;即您真正想保留的客户。

    如果您确实需要限制对特定计算机集的访问,您应该考虑使用带有客户端证书的 SSL/TLS 之类的东西作为您的第一道防线。带有客户端证书的 TLS 描述为 here

    【讨论】:

      【解决方案5】:

      IP 很容易像电子邮件发件人一样被伪造,我强烈建议不要仅仅依赖它们。

      【讨论】:

      • 不像邮件发件人那样简单,因为您回复指定的IP地址。所以真正的问题是在采取行动时信任源 IP,但在提供信息时你可以依赖它们
      • 是的,我赞成 stevelvs 的回答,因为他区分了写入和只读。顺便提一句。邮件发件人完全相同,因为在这两种情况下您都无法收到答复。
      猜你喜欢
      • 2010-10-10
      • 1970-01-01
      • 2017-10-09
      • 2011-02-05
      • 2019-11-20
      • 2011-01-15
      • 1970-01-01
      • 2020-05-10
      • 1970-01-01
      相关资源
      最近更新 更多