Проверить IP по маске

Discussion in 'PHP' started by prescott, 15 Mar 2010.

  1. prescott

    prescott Elder - Старейшина

    Joined:
    28 Jul 2008
    Messages:
    132
    Likes Received:
    43
    Reputations:
    5
    Есть маски типа 83.151.0.0/20

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

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

    prescott Elder - Старейшина

    Joined:
    28 Jul 2008
    Messages:
    132
    Likes Received:
    43
    Reputations:
    5
    Маска такого вида не определяет диапазон типа 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=>031=>130=>329=>728=>1527=>3126=>6325=>12724=>25523=>51122=>102321=>204720=>4095,
                          
    19=>819118=>1638317=>3276716=>6553515=>13107114=>26214313=>52428712=>104857511=>2097151,
                          
    10=>41943039=>83886078=>167772157=>335544316=>671088635=>1342177274=>2684354553=>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;
    }
     
  3. LStr1ke

    LStr1ke Elder - Старейшина

    Joined:
    29 Jul 2009
    Messages:
    801
    Likes Received:
    145
    Reputations:
    73
    А такая не пододит?
    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 :("
     
  4. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    prescott Вроде задача была та же и это работало; https://forum.antichat.ru/showpost.php?p=1162648&postcount=9338
     
    _________________________