【问题标题】:IPV6 notation of $_SERVER['REMOTE_ADDR']$_SERVER['REMOTE_ADDR'] 的 IPV6 表示法
【发布时间】:2012-05-06 07:36:28
【问题描述】:

我有许多项目的功能依赖于$_SERVER['REMOTE_ADDR]$_SERVER['HTTP_X_FORWARDED_FOR']$_SERVER['CLIENT_IP'] 提供的 IP 地址。

IPV4 地址很容易匹配,因为我们总是以相同的格式接收它们:4 个不带前导 0 的整数,用点 . 分隔。

而 IPV6 地址可以压缩。例如:FF01:0:0:0:0:0:0:101 -> FF01::101

我一直在研究这个问题,但没有发现任何相关信息,所以我想请教您的经验。 $_SERVER['REMOTE_ADDR] 是否使用标准?假设它总是以压缩或未压缩的形式接收是否安全?

或者我应该在尝试测试之前压缩所有的 IPV6 字符串?

注意:

理想情况下,我希望将 IPV6 地址作为字符串而不是二进制结构处理,以提高数据库/源代码的可读性并允许更轻松的 IP 范围匹配。

【问题讨论】:

  • 我没有使用过 IPv6,但我的印象是你应该 inet_pton() 任何你想操作的地址。
  • @ÁlvaroG.Vicario 感谢您的评论,我一定会研究这个功能。但如果可能的话,我想保留字符串表示法。

标签: php ipv6


【解决方案1】:

如果您首先使用inet_pton(),然后将其转换回带有inet_ntop() 的字符串,您应该有一个一致的字符串表示。我不会依赖输入来保持一致......

【讨论】:

  • 我测试了它,它似乎给出了一致的结果。这可能正是我正在寻找的。我将在现实生活中的项目中对其进行测试,看看它是否可以工作。
  • 我已经测试过了,效果很好。这很简单。谢谢!
  • @Sander inet_pton()inet_ntop()... 你能把这些链接放在你的答案中吗?
【解决方案2】:

CGI spec 明确表明任何符合 RFC 的 IPv6 地址都是有效的:

4.1.8.  REMOTE_ADDR

   The REMOTE_ADDR variable MUST be set to the network address of the
   client sending the request to the server.

      REMOTE_ADDR  = hostnumber
      hostnumber   = ipv4-address | ipv6-address
      ipv4-address = 1*3digit "." 1*3digit "." 1*3digit "." 1*3digit
      ipv6-address = hexpart [ ":" ipv4-address ]
      hexpart      = hexseq | ( [ hexseq ] "::" [ hexseq ] )
      hexseq       = 1*4hex *( ":" 1*4hex )

  The format of an IPv6 address is described in RFC 3513 [15].

一个理智的程序员会验证所有输入。因此,您应该将任何环境变量视为受污染的输入并验证/转换。客户提供的标头(例如 X-Forward-For 等)应始终受到怀疑。

那么扩展 IPv6 地址呢?

这个问题有been asked beforethere are several solutions,包括a PEAR one

希望这会有所帮助!

【讨论】:

  • 谢谢!我当然会首先验证它是一个有效的 IP。实际上,我已经在使用stackoverflow.com/questions/444966/… 中提供的功能将 IPV4 和 IPV6 存储在数据库中。 PEAR 解决方案看起来不错,我一定会试一试。
  • 即使考虑到 Pear 函数,尝试在 IPv6 上以字符串格式(甚至完全扩展)进行范围匹配也将非常困难,特别是如果范围不落在 nybble 边界上(即/62)
  • @Alnitak 好点。我的 IP 范围可以减少到半字节边界,所以假设我有一致的输入,一个简单的 strpos 应该可以解决问题。
【解决方案3】:

IPv6 地址的推荐格式为RFC 5952

但是,您不能依赖所有地址都采用这种格式,而且字符串格式对于范围比较来说尤其糟糕。阅读 RFC 会让您了解合法地表示同一 IPv6 地址的方法有多少。

您确实应该解析地址(使用inet_pton,如其他地方所述)并在生成的 128 位字段上执行范围比较。

您通常只关心 64 个最高有效位,这在大多数架构上都非常适合 long

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 2013-10-19
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多