Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 美元服务器的IPV6表示法[';远程地址';]_Php_Ipv6 - Fatal编程技术网

Php 美元服务器的IPV6表示法[';远程地址';]

Php 美元服务器的IPV6表示法[';远程地址';],php,ipv6,Php,Ipv6,我有许多项目的功能依赖于$\u服务器['REMOTE\u ADDR],$\u服务器['HTTP\u X\u FORWARDED\u']和$\u服务器['CLIENT\u IP']提供的IP地址 IPV4地址很容易匹配,因为我们总是以相同的格式接收它们:4个不带前导0的整数,用点分隔 而IPV6地址可以压缩。例如:FF01:0:0:0:0:0:101->FF01::101 我一直在研究这个问题,但没有发现任何相关的东西,所以我想了解你的经验。$\u服务器['REMOTE\u ADDR]是否使用标准

我有许多项目的功能依赖于
$\u服务器['REMOTE\u ADDR]
$\u服务器['HTTP\u X\u FORWARDED\u']
$\u服务器['CLIENT\u IP']
提供的IP地址

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

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

我一直在研究这个问题,但没有发现任何相关的东西,所以我想了解你的经验。
$\u服务器['REMOTE\u ADDR]
是否使用标准?可以安全地假设它总是以压缩或未压缩的形式接收吗

或者我应该在尝试测试IPV6字符串之前压缩它们吗

注意:

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

建议的IPV6地址格式为

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

您确实应该解析地址(如其他地方所述,使用
inet\u pton
),并对生成的128位字段执行范围比较

通常情况下,您只关心64个最高有效位,这非常适合大多数体系结构上的

很明显,任何符合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地址呢

这一问题包括:


希望这有帮助

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

我没有使用IPv6,但我觉得您应该
inet\u pton()
任何您想要操作的地址。@lvaroG.Vicario谢谢您的评论,我肯定会研究这个函数。但是如果可能的话,我想保留字符串符号。谢谢!我当然会首先验证它是一个有效的IP。实际上,我正在使用中提供的函数在数据库中存储IPV4和IPV6。PEAR解决方案看起来不错,我一定会尝试一下。即使使用PEAR函数,尝试在IPv6上以字符串格式(甚至完全扩展)进行范围匹配也是非常困难的,特别是如果范围不在Nyble边界(即a/62)@Alnitak good point。我的IP范围可以减少到半字节边界,因此,假设我有一致的输入,一个简单的
strpos
应该可以做到这一点。我测试了它,它似乎给出了一致的结果。这可能正是我要找的。我将在一个真实的项目中测试它,看看它是否能工作。我已经测试过了,它工作得非常完美。这很简单。谢谢@桑德和。。。你能把这些链接放在你的答案里吗?