В IPv4 имеются зарезервированные диапазоны адресов, в некоторых случаях надо проверить, не попал ли адрес в один из них
См. в PDF
Или на PasteBin
Надеюсь, ничего не забыл. Таблица нагло выдрана из лекции, но я сверялся с Википедией и другими интернетами.
Для порядку заведем регулярное выражение для проверки IP
$ip_pattern="#(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)#";
И функцию, которая проверяет, а IP ли вообще у нас на входе:
function isip($ip_str) //соответствие данных формату IP { global $ip_pattern; $ret=FALSE; if (preg_match($ip_pattern,$ip_str)) { $ret=TRUE; } return $ret; }
Теперь функцию, которая будет проверять, попал ли IP в нужный диапазон:
function chkdiapip ($user_ip, $ip_from, $ip_to) //попадает ли ip в нужный диапазон { return ( ip2long($user_ip)>=ip2long($ip_from) && ip2long($user_ip)<=ip2long($ip_to) ); }
Создадим двумерный массив со списком диапазонов:
$spec_list = array( array ("0.0.0.0","0.255.255.255", "Current network"), array ("255.255.255.255","255.255.255.255", "Broadcast"), array ("255.0.0.0","255.255.255.255", "Reserved by the IETF, broadcast"), array ("10.0.0.0","10.255.255.255", "Private network"), array ("100.64.0.0","100.127.255.255", "Shared Address Space"), array ("127.0.0.0","127.255.255.255", "Loopback"), array ("169.254.0.0","169.254.255.255", "Link-local"), array ("172.16.0.0","172.31.255.255", "Private network"), array ("192.0.0.0","192.0.0.7", "DS-Lite"), array ("192.0.0.170","192.0.0.170", "NAT64"), array ("192.0.0.171","192.0.0.171", "DNS64"), array ("192.0.2.0","192.0.2.255", "Documentation example"), array ("192.0.0.0","192.0.0.255", "Reserved by the IETF"), array ("192.88.99.0","192.88.99.255", "Anycast"), array ("192.88.99.1","192.88.99.1", "IPv6 to IPv4 Incapsulation"), array ("192.168.0.0","192.168.255.255", "Private network"), array ("198.51.100.0","198.51.100.255", "Documentation example"), array ("198.18.0.0","198.19.255.255", "Test IP"), array ("203.0.113.0","203.0.113.255", "Documentation example"), array ("224.0.0.0","224.255.255.255", "Multicast"), array ("240.0.0.0","240.255.255.255", "Future reserved") );
И функцию, которая будет все это безобразие в цикле перебирать, и если IP попадет в какой-то из диапазонов - выдаст диапазон и описание. Если не попадет - вернет -1.
function get_spec_diap ($user_ip, $listspec) { for ($i=0;$i<sizeof($listspec);$i++) { $item = $listspec[$i]; if (chkdiapip($user_ip, $item[0], $item[1])) { return $item[0]."\t".$item[1]."\t".$item[2]."\t\n"; } } return -1; }
Ну шоб два раза не вставать, сделаем еще и функцию, оглашающую весь список:
function printspecdiap ($listspec) { for ($i=0;$i<sizeof($listspec);$i++) { $item = $listspec[$i]; echo $item[0]."\t\t".$item[1]."\t\t\t".$item[2], "\t\t\t\n"; } }
Pingback: PHP. Проверка корректности IP-адреса | Персональный блог Толика Панкова
Pingback: C#, проверка попадания IP-адреса в зарезервированные диапазоны. | Персональный блог Толика Панкова