PHP: обнаружение входа IP в определенный диапазон IP - PullRequest
1 голос
/ 04 мая 2010

У меня есть функция PHP, которая определяет, подходит ли один IP к определенному диапазону IP, но я не знаю, как узнать сеть и маску 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;
}
}
?>

Ответы [ 3 ]

2 голосов
/ 04 мая 2010

Вы не можете просто узнать маску по IP. Вам нужно знать, что подсеть или что-то еще, такой же IP может существовать в 32-х подсетях.

1 голос
/ 04 мая 2010

Когда 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;
}
1 голос
/ 04 мая 2010

Вроде, но не совсем. Вы никогда не должны заботиться о маске внешней сети или сети.

Однако, если вы находитесь внутри сети, и DHCP-сервер доступен, вы можете запросить его через протокол DHCP, чтобы получить настройки внутренней (локальной) сети. Если вы находитесь в локальной сети, вы также можете использовать что-то вроде протокола RIP для связи с сетевыми устройствами. Я предполагаю, однако, что вас больше интересует какое-то сканирование портов с использованием nmap или чего-то еще, и вы не очень заинтересованы в сетевом взаимодействии ... В таком случае ...

...