如何检查一个IP地址是在两个IP范围内的PHP?-支持ipv6


How to check an IP address is within a range of two IPs in PHP? - with ipv6 support

这基本上是这个问题的重复:如何检查IP地址是否在PHP的两个IP范围内?

然而,上述问题的解决方案不支持ipv6。是否有类似的解决方案与ipv6的支持?

建议:

string inet_ntop ( string $in_addr )

该函数转换32位IPv4地址或128位IPv6地址(如果是PHP地址)是建立与IPv6支持启用)到一个地址族合适的字符串表示。

你还应该看到

string inet_pton ( string $address )
<<h3> inet_ntop()例子/h3>
<?php
$packed = chr(127) . chr(0) . chr(0) . chr(1);
$expanded = inet_ntop($packed);
/* Outputs: 127.0.0.1 */
echo $expanded;
$packed = str_repeat(chr(0), 15) . chr(1);
$expanded = inet_ntop($packed);
/* Outputs: ::1 */
echo $expanded;
?>

范围

比较

在PHP 5.1.0中介绍了以下两个函数,inet_ptoninet_pton。它们的目的是将人类可读的IP地址转换为其打包的in_addr表示。由于结果不是纯二进制的,我们需要使用unpack函数来应用位运算符。

两个函数都支持IPv6和IPv4。唯一的区别是如何从结果中解压缩地址。对于IPv6,您将使用A16打开内容,而对于IPv4,您将使用A4打开内容。

为了更好地理解前面的内容,这里有一个小示例输出来帮助说明:

// Our Example IP's
$ip4= "10.22.99.129";
$ip6= "fe80:1:2:3:a:bad:1dea:dad";

// ip2long examples
var_dump( ip2long($ip4) ); // int(169239425)
var_dump( ip2long($ip6) ); // bool(false)

// inet_pton examples
var_dump( inet_pton( $ip4 ) ); // string(4)
var_dump( inet_pton( $ip6 ) ); // string(16)

我们在上面演示了inet_*家族同时支持IPv6和v4。下一步是将打包的结果转换为未打包的变量。

// Unpacking and Packing
$_u4 = current( unpack( "A4", inet_pton( $ip4 ) ) );
var_dump( inet_ntop( pack( "A4", $_u4 ) ) ); // string(12) "10.22.99.129"

$_u6 = current( unpack( "A16", inet_pton( $ip6 ) ) );
var_dump( inet_ntop( pack( "A16", $_u6 ) ) ); //string(25) "fe80:1:2:3:a:bad:1dea:dad"

注意:current函数返回数组的第一个索引。它相当于说$array[0].

在解包和打包之后,我们可以看到我们得到了与输入相同的结果。这是一个简单的概念证明,以确保我们不会丢失任何数据。

最后使用,

if ($ip <= $high_ip && $low_ip <= $ip) {
  echo "in range";
}

参考:php.net