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

标签 php ip ipv6

这本质上是这个问题的重复:How to check an IP address is within a range of two IPs in PHP?

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

最佳答案

建议:

string inet_ntop ( string $in_addr )

This function converts a 32bit IPv4, or 128bit IPv6 address (if PHP was built with IPv6 support enabled) into an address family appropriate string representation.

您还应该看到,

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

关于php - PHP中如何检查IP地址是否在两个IP范围内? - 支持ipv6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16357171/

相关文章:

php - 如何在 PHP 中展平数组?

python - 如何使用 Python 3.x 获取网站的 IP 地址?

javascript - 在 PHP 中从国家代码获取货币信息

ios - 应用程序在启动屏幕上崩溃(在 iPad 10.2 上)

c++ - 如何显示当前的IPv6连接?

php - 语法错误或访问冲突 : 1103 Incorrect table name with $_POST array data

php - 无法在 php 中输出最后一个自动生成的 ID

php - PHP 中的替代 if/else 语法叫什么?

iphone - MATLAB 监听 TCP/IP 端口

validation - 从 IP 确定国家/地区 - IPv6