$ _SERVER ['REMOTE_ADDR']的IPV6表示法

时间:2012-04-25 15:22:50

标签: php ipv6

我有很多项目的功能依赖于$_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范围匹配。

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分: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

希望这有帮助!

答案 2 :(得分:1)

IPv6地址的推荐格式位于RFC 5952

但是,您不能依赖于该格式的所有地址,并且字符串格式对于范围比较尤其糟糕。阅读RFC将让您了解合法表示相同IPv6地址的方式有多少。

你真的应该解析地址(使用其他地方提到的inet_pton)并对得到的128位字段进行范围比较。

通常情况下,您只会关注64个最重要的位,这些位很适合大多数架构上的long