繁体   English   中英

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

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

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

但是,上述问题的解决方案不支持ipv6。 ipv6支持有类似的解决方案吗?

建议:

string inet_ntop ( string $in_addr )

此函数将32位IPv4或128位IPv6地址(如果PHP是在启用IPv6支持的情况下构建的)转换为地址族适当的字符串表示形式。

您还应该看到,

string inet_pton ( string $address )

inet_ntop()示例

<?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"

注意:当前函数返回数组的第一个索引。 等于说$ array [0]。

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

最终使用,

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

参考: php.net

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM