ANTICHAT

ANTICHAT (https://forum.antichat.io/index.php)
-   PHP (https://forum.antichat.io/forumdisplay.php?f=37)
-   -   Проверить IP по маске (https://forum.antichat.io/showthread.php?t=187051)

prescott 15.03.2010 08:09

Проверить IP по маске
 
Есть маски типа 83.151.0.0/20

Считается как то так: http://www.opennet.ru/ipcalc.shtml?ip=83.151.0.0&netmask=/20&submit=

Как в PHP просто и главное точно проверить подходит ли IP под эту маску?

prescott 15.03.2010 09:11

Маска такого вида не определяет диапазон типа 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;
} 


LStr1ke 15.03.2010 09:38

А такая не пододит?
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 :("; 


Gifts 15.03.2010 19:17

prescott Вроде задача была та же и это работало; https://forum.antichat.ru/showpost.php?p=1162648&postcount=9338


Время: 20:30