将IP地址与IPv6块进行比较

时间:2012-01-12 13:45:01

标签: php ip ipv6

我正在使用PHP将用户IP地址与IP块列表进行比较,其中大多数是IPv4,但其中一些是IPv6。我从用户那里得到的IP地址总是与IPv4兼容,或者我假设是这样。我该如何比较呢?

这就是我现在正在使用的:

function ip_check($ip, $cidr) {
  list($net, $mask) = split("/", $cidr);
  $ip_address = decbin(ip2long($ip));
  $ip_net = decbin(ip2long($net));
  if (substr($ip_net, 0, $mask) == substr($ip_address, 0, $mask)) {
    return TRUE;
  }
  return FALSE;
}

编辑:作为一个例子,我需要看看 194.144.247.254 是否属于 2001:067c:006c :: / 48 2001:1a98 :: / 32 217.151.176.18/32 217.171.208.0/20

2 个答案:

答案 0 :(得分:3)

我写过a library to do this sort of IP address comparison

$ip = IP_Address::factory($ip);
$block = IP_Network_Address::factory($cidr);

return $block->encloses_address($ip);

类层次结构有点迟钝,因为它旨在实现Kohana的透明扩展。

我没有实现将IPv4地址转换为特殊的普通IPv6地址的代码,因此您可能需要在比较之前进行少量检查。 当然欢迎拉动请求:)

答案 1 :(得分:0)

  

作为一个例子,我需要看看 194.144.247.254 是否属于    2001:067c:006c :: / 48 2001:1a98 :: / 32 217.151.176.18/32 或   的 217.171.208.0/20

IPv4地址如何属于IPv6范围?您只能通过这种方式比较相同类型的地址。另一件事没有意义。