【问题标题】:PHP: detecting IP's entry to a specific IP rangePHP:检测IP进入特定IP范围
【发布时间】:2010-05-03 23:31:23
【问题描述】:

我有判断一个IP是否进入特定IP范围的PHP函数,但我不知道如何找出IP的网络和掩码。有人可以帮忙吗?

<?
// Example of calling and checking IP-address 192.168.0.4
// belonging to a network 192.168.0.0 with mask 255.255.255.248

if(ip_vs_net("192.168.0.4","192.168.0.0","255.255.255.248")){
print "Address belongs to a netwok<BR>";
} else {
print "Address is out of subnetwork's range<BR>";
}

function ip_vs_net($ip,$network,$mask){
if(((ip2long($ip))&(ip2long($mask)))==ip2long($network)){
return 1;
} else {
return 0;
}
}
?>

【问题讨论】:

  • 我需要在我的网站上创建安全措施,允许每位用户仅使用 1 个 IP 子网。用户的 IP 将是使用拨号互联网连接的动态“原因”,但将在一个 IP 子网内。我想限制使用不同的 IP 子网,但只有一个将在第一次访问用户区域时确定并存储在白名单中以供确定的用户使用。

标签: php range ip detect


【解决方案1】:

您不能仅根据 IP 找出掩码。您需要知道子网是什么,相同的 IP 可能存在于 32 个子网中。

【讨论】:

    【解决方案2】:

    当 IP 地址是经典的(A、B、C 类等)时,很容易找到子网掩码,因为它根据地址范围是固定的。

    现在使用 CIDR,不可能知道确切的子网掩码,因为任何连续的前缀都可以用作子网掩码。

    但是,经典子网可能适用于您的情况。这绝对比没有好。你可以使用这个函数找出子网掩码,

    function get_net_mask($ip) {
       if (is_string($ip)) {
          $ip = ip2long($ip);
       }
       if (($ip & 0x80000000) == 0) {
           $mask = 0xFF000000;
       } elseif (($ip & 0xC0000000) == (int)0x80000000) {
           $mask = 0xFFFF0000;
       } elseif (($ip & 0xE0000000) == (int)0xC0000000) {
           $mask = 0xFFFFFF00;
       } else {
           $mask = 0xFFFFFFFF;
       }
       return $mask;
    }
    

    【讨论】:

      【解决方案3】:

      有点,但不是真的。您永远不应该真正关心或必须关心外部网络网络掩码或网络。

      但是,如果您位于网络内部,并且 DHCP 服务器可用,则可以通过 DHCP 协议查询它以获取您的内部(本地)网络设置。如果您在 LAN 中,您还可以使用 RIP 协议之类的东西与网络设备进行通信。不过我猜你对使用 nmap 之类的某种端口扫描更感兴趣,并且对网络并不真正感兴趣......在这种情况下.. FUH :)

      【讨论】:

      • Zak,你说的真的很难理解! :-) 我只想在我的网站上使用它,并希望只允许特定用户使用 1 个子网!
      • 您这么说,但您的示例显示使用 192.x.x.x 地址,根据定义,该地址是内部(非 Internet)网络地址。你是不是说你想知道是否有人来自互联网上的同一个外部来源?如果是这样,我会说只是对他们的 IP 运行跟踪路由并记录最后一跳路由器 IP 地址是什么。使用它作为他们的身份验证而不是网络子网。
      猜你喜欢
      • 2011-01-09
      • 2015-11-23
      • 2016-02-24
      • 1970-01-01
      • 1970-01-01
      • 2013-08-22
      • 2018-01-04
      • 2018-01-09
      • 1970-01-01
      相关资源
      最近更新 更多