【问题标题】:REMOTE_ADDR returns 2 IPv4 instead of oneREMOTE_ADDR 返回 2 IPv4 而不是 1
【发布时间】:2016-04-10 21:39:13
【问题描述】:

我将 IP 存储到曾经在 char(15) 下工作的数据库中,最近我得到越来越多的 IP,如下所示:

'172.29.93.25, 94.56.207.248'

不过,大多数条目看起来都不错。这不到所有案例的 1%。

我正在使用的命令:

$ip = $_SERVER['REMOTE_ADDR'] 

在我看来,上面的 IP 不像 IPv6,而是两个 IPv4 之间用逗号隔开。这怎么可能?

【问题讨论】:

  • 我有点困惑,您在 REMOTE_ADDR 中有一个地址列表。我查看了symfony 源代码以接收客户端IP,因为我看到它返回REMOTE_ADDR 作为单个地址,只有FORWARDED 标头作为列表处理。

标签: php ipv6


【解决方案1】:

第一个 IPv4 地址可能是负载平衡器的内部 IP 地址。第二个 IPv4 地址可能是客户端的 IP 地址,并且可能被负载均衡器包含在 X-Forwarded-For http header 中。

更新:

我看到您已经编辑了问题并将一个带有10.x.x.x IP 地址的示例替换为一个具有172.x.x.x IP 地址的新示例。在这种新情况下,第一个 IP 可能是代理服务器。通常,您可以在此字段中使用逗号分隔的 IP 地址列表,该列表可以任意长,它代表请求经过的所有代理和负载均衡器。最后一个 IP 地址是原始客户端的 IP。

【讨论】:

  • 不幸的是,这只是一个糟糕的例子。我将 IP 换成了另一个真正的错误 IP。我的猜测是,这是某种伪造 IP 的垃圾邮件发送者。
  • 我不认为这是一个坏例子。更新示例中的第一个地址可能是代理服务器。通常,您可以在此字段中使用逗号分隔的 IP 地址列表,该列表可以任意长,它代表请求经过的所有代理和负载均衡器。最后一个 IP 地址是原始客户端的 IP。
  • 有道理!谢谢!
  • 我现在通过删除其他地址来修复它: $tmp = explode(',', $_SERVER['REMOTE_ADDR']); $ip = end($tmp);
  • 172.29.93.25 也在私有地址范围内 (172.16.0.0/12)。
【解决方案2】:

第一个地址是10.10 地址,这意味着它是一个非路由地址。这是一个负载均衡器,或者您有一个虚拟机(即 Amazon AWS),该虚拟机具有通过某个网关到达 Internet 的非公共地址。

【讨论】:

    【解决方案3】:

    第一个地址是私人地址,你可以了解address allocation for private internets here

    【讨论】:

      猜你喜欢
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-03
      • 1970-01-01
      • 2016-05-03
      • 2022-12-16
      相关资源
      最近更新 更多