Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |

15.03.2010, 08:09
|
|
Участник форума
Регистрация: 28.07.2008
Сообщений: 158
Провел на форуме: 728470
Репутация:
115
|
|
Проверить IP по маске
Есть маски типа 83.151.0.0/20
Считается как то так: http://www.opennet.ru/ipcalc.shtml?ip=83.151.0.0&netmask=/20&submit=
Как в PHP просто и главное точно проверить подходит ли IP под эту маску?
|
|
|

15.03.2010, 09:11
|
|
Участник форума
Регистрация: 28.07.2008
Сообщений: 158
Провел на форуме: 728470
Репутация:
115
|
|
Маска такого вида не определяет диапазон типа 83.151.0.0 - 83.151.0.20
Вот нашел более менее понятное объяснение алгоритма расчета маски: http://www.cap-design.ru/ksptp/5_2_4.php,
а вот и функция, похожая на верную:
PHP код:
function Check_Ip($Ip_For_Search, $Allow_Ip_Range)
{
$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);
$Ip_For_Search_Converted = ip2long($Ip_For_Search);
$Result = FALSE;
foreach ( $Allow_Ip_Range as $Value )
{
list($ip, $prefix) = preg_split('/\//',$Value);
$Range_Start = ip2long($ip);
$Range_End = $Range_Start + $ip_count["$prefix"];
echo "";
if ( $Ip_For_Search_Converted >= $Range_Start && $Ip_For_Search_Converted <= $Range_End )
{
return TRUE;
}
}
return $Result;
}
|
|
|

15.03.2010, 09:38
|
|
Постоянный
Регистрация: 29.07.2009
Сообщений: 400
Провел на форуме: 1455812
Репутация:
150
|
|
А такая не пододит?
PHP код:
# usage: checkIp("ip to check","mask");
function checkIp($ip,$mask) {
list($mask_ip,$mask_max) = explode("/",$mask);
$ip_mas = explode(".",$mask_ip);
if(preg_match("#($ip_mas[0])\.($ip_mas[1])\.($ip_mas[2])\.(\d{1,3})$#i",$ip,$need))
{
if($need[4] <= $mask_max) return true; else return false;
}else return false;
}
if(checkIp("83.151.0.12","83.151.0.0/20")) {
echo "Ip eq MASK :)";
}else echo "Bad IP :(";
|
|
|

15.03.2010, 19:17
|
|
Reservists Of Antichat - Level 6
Регистрация: 25.04.2008
Сообщений: 827
Провел на форуме: 2769640
Репутация:
1304
|
|
prescott Вроде задача была та же и это работало; https://forum.antichat.ru/showpost.php?p=1162648&postcount=9338
__________________
Любая действущая программа устарела.
Создайте систему, которой сможет пользоваться даже дурак ,и только дурак захочет ею пользоваться.
Как правильно задавать вопросы: _http://www.yakimchuk.ru/questions.htm
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|