【问题标题】:Compare IP address to IPv6 block将 IP 地址与 IPv6 块进行比较
【发布时间】:2012-02-08 19:13:51
【问题描述】:

我正在使用 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::/482001:1a98:: /32217.151.176.18/32217.171.208.0/20

【问题讨论】:

    标签: php ip ipv6


    【解决方案1】:

    我已经写了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 地址的代码,因此您可能需要在比较之前进行少量检查。 当然欢迎拉取请求:)

    【讨论】:

    • 太棒了,但不幸的是,在这种情况下我无法安装 PEAR Math_BigInteger 类。
    • 许可证限制,或者只是服务器权限?您始终可以下载该课程并将其手动包含在您的应用程序中。没有那个类,IIRC IPv4 的东西可以正常工作。
    • 服务器。我可能会尝试下载课程。
    • 实际上,对于您正在做的事情,它可能根本不需要 PEAR 类。
    【解决方案2】:

    例如,我需要查看 194.144.247.254 是否属于 2001:067c:006c::/482001:1a98::/32217.151.176.18/32217.171.208.0/20.

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

    【讨论】:

    • IPv6 地址与 IPv4 兼容,返回为 xxxx.xxxx.xxxx.xxxx
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 2020-07-11
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    相关资源
    最近更新 更多