Created
October 11, 2015 22:33
-
-
Save KarelWintersky/30c0ffc0f37155b3d6fd to your computer and use it in GitHub Desktop.
KW: IP functions
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* EXAMPLES | |
$ip="127.0.12.7"; // IP для проверки | |
$test_ip=explode(".",$ip); | |
$range="127.0.0.0/22"; // Маска подсети | |
$chk=range_parser($range); | |
chk_ips($test_ip,$chk[0],$chk[1]); // FALSE | |
$range="127.0.0.0-127.1.0.255"; // Интервал IP-адресов | |
$chk=range_parser($range); | |
chk_ips($test_ip,$chk[0],$chk[1]); // TRUE | |
$range="127.0.12.2"; // Одиночный IP | |
$chk=range_parser($range); | |
chk_ips($test_ip,$chk[0],$chk[1]); // FALSE | |
$range="127.*.*.*"; // Маска IP | |
$chk=range_parser($range); | |
chk_ips($test_ip,$chk[0],$chk[1]); // TRUE | |
//*/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* === ПРОВЕРКА IP === */ | |
/** | |
* Проверка вхождения IP4 в заданный диапазон | |
* @param $ip - массив октетов проверяемого IP | |
* @param $ip_start - массив октетов начала интервала | |
* @param $ip_end - массив октетов конца интервала | |
* В интервалах допускаются маски '*' | |
* @return bool - TRUE или FALSE, входит IP или нет в диапазон | |
* | |
* http://www.manhunter.ru/webmaster/39_proverka_prinadlezhnosti_ip_adresa_zadannomu_diapazonu.html | |
*/ | |
function chk_ips($ip, $ip_start, $ip_end) | |
{ | |
if (!isset($ip_start)) $ip_start = array('*', '*', '*', '*'); | |
if (!isset($ip_end)) $ip_end = array('*', '*', '*', '*'); | |
for ($i = 0; $i < 4; $i++) { | |
if ($ip_start[$i] == '*') $ip_start[$i] = '0'; | |
if ($ip_end[$i] == '*') $ip_end[$i] = '255'; | |
} | |
$test_ip = kw_ip2long(join('.', $ip)); | |
$range_start = kw_ip2long(join('.', $ip_start)); | |
$range_end = kw_ip2long(join('.', $ip_end)); | |
/* if (($test_ip >= $range_start) && ($test_ip <= $range_end)) { | |
// IP входит в интервал | |
return true; | |
} else { | |
// IP не входит в интервал | |
return false; | |
} */ | |
return !!(($test_ip >= $range_start) && ($test_ip <= $range_end)); | |
} | |
/** | |
* Преобразование IP4 по модулю | |
* @param string $ip | |
* @return int | |
*/ | |
function kw_ip2long($ip) | |
{ | |
if (($r = ip2long($ip)) < 0) { | |
$r += 4294967296; | |
} | |
return $r; | |
} | |
/** | |
* Функция разворачивания маски подсети | |
* @param $ip массив октетов начала диапазона | |
* @param $mask маска | |
* @return array массив IP конца диапазона | |
*/ | |
function addip($ip, $mask) | |
{ | |
// Количество IP в каждой маске | |
$ip_count = Array(32 => 0, 31 => 1, 30 => 3, 29 => 7, 28 => 15, 27 => 31, 26 => 63, | |
25 => 127, 24 => 255, 23 => 511, 22 => 1023, 21 => 2047, 20 => 4095, | |
19 => 8191, 18 => 16383, 17 => 32767, 16 => 65535, 15 => 131071, | |
14 => 262143, 13 => 524287, 12 => 1048575, 11 => 2097151, | |
10 => 4194303, 9 => 8388607, 8 => 16777215, 7 => 33554431, | |
6 => 67108863, 5 => 134217727, 4 => 268435455, 3 => 536870911, | |
2 => 1073741823); | |
$x = Array(); | |
$ips = $ip_count[$mask]; | |
$x[0] = $ip[0] + intval($ips / (256 * 256 * 256)); | |
$ips = ($ips % (256 * 256 * 256)); | |
$x[1] = $ip[1] + intval($ips / (256 * 256)); | |
$ips = ($ips % (256 * 256)); | |
$x[2] = $ip[2] + intval($ips / (256)); | |
$ips = ($ips % 256); | |
$x[3] = $ip[3] + $ips; | |
return ($x); | |
} | |
/** | |
* Парсер диапазонов IP | |
* @param $range строка диапазона | |
* @return array|bool Массив из двух массивов ([0]=>ip_start, [1]=>ip_end) или FALSE если строка не является допустимым диапазоном | |
*/ | |
function range_parser($range) | |
{ | |
$range = trim($range); | |
// Проверка диапазона вида x.x.x.x-y.y.y.y | |
if (strpos($range, "-")) { | |
$tmp = explode("-", $range); | |
$ip_start = explode(".", trim($tmp[0])); | |
$ip_end = explode(".", trim($tmp[1])); | |
} // Проверка диапазона вида x.x.x.x/y | |
elseif (strpos($range, "/")) { | |
$tmp = explode("/", $range); | |
$ip_start = explode(".", $tmp[0]); | |
// Развернуть маску подсети | |
$ip_end = addip($ip_start, $tmp[1]); | |
} // Проверка диапазона вида x.x.*.* или одиночного IP | |
else { | |
$ip_start = $ip_end = explode(".", $range); | |
} | |
// Простенькая проверка на корректность полученных диапазонов | |
if (count($ip_start) == 4 && count($ip_end) == 4) { | |
return array($ip_start, $ip_end); | |
} else { | |
return false; | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment