За последние 24 часа нас посетили 17283 программиста и 1627 роботов. Сейчас ищут 1259 программистов ...

Диапазон IP-адресов вставить в массив

Тема в разделе "PHP для новичков", создана пользователем Pcrepair, 20 апр 2015.

  1. Pcrepair

    Pcrepair Активный пользователь

    С нами с:
    22 сен 2011
    Сообщения:
    14
    Симпатии:
    0
    Добрый день.
    Есть следующая ситуация :

    Код (Text):
    1. <?php
    2. $cur_ip_adrr = $_SERVER['REMOTE_ADDR'];  //получили текущий адресс
    3. $ip_array = array('192.168.0.1','192.168.0.2','192.168.0.3','127.0.0.1');  //массив по простому
    4. if (in_array($cur_ip_adrr, $ip_array))  echo 'YES';  //проверили вхождение элемента в массив
    5. ?>
    Но на самом деле массив ИП-адресов выглядит так 66.231.188.0/24 (для примера), точнее таких массивом много (допустим 10)

    Вопрос : как средствами РНР из 66.231.188.0/24 сделать последовательность элементов?
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.797
    Симпатии:
    1.331
    Адрес:
    Лень
    регуляркой заделать preg_match
     
  3. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    неправильный вопрос.
    Нужно проверить входит ли ip-адрес в какуюто из подсетей перечисленных в массиве.
    кто сказал что для этого нужно превращать подсеть во всю последовательность адресов?
    гуглим CIDR, маска подсети т.д.
    ибо зная как это работает, сразу станет понятно как должна выглядеть функция.
    например так
    Код (PHP):
    1. function ipCIDRcheck($ip, $cidr) {
    2.   list($net, $mask) = explode('/', $cidr);
    3.   return ( ip2long($ip) & (-1<<(32-$mask)) ) == ip2long($net);
    4. } 
    далее просто перебираем массив с подсетями и проверяем куда входит наш адрес.
     
  4. Pcrepair

    Pcrepair Активный пользователь

    С нами с:
    22 сен 2011
    Сообщения:
    14
    Симпатии:
    0
    это цикл FOR имеется ввиду?
    функция рабочая, спасибо.
     
  5. Pcrepair

    Pcrepair Активный пользователь

    С нами с:
    22 сен 2011
    Сообщения:
    14
    Симпатии:
    0
    И вот что получилось :

    Код (Text):
    1. <?php
    2. //массив СИДР чиста для проверки работоспособности
    3. $ip_array = array(
    4. '192.168.0.0/24',    //доступ к серверу из ЛВС
    5. '127.0.0.0/8'        //локальный хост
    6. );
    7.  
    8. //текущий ИП-адрес посетителя
    9. $cur_ip_adrr = $_SERVER['REMOTE_ADDR'];
    10.  
    11. //функция определения вхождения ИП в СИДР, спасибо что подсказали
    12. function ipCIDRcheck($ip, $cidr) {
    13.   list($net, $mask) = explode('/', $cidr);
    14.   return ( ip2long($ip) & (-1<<(32-$mask)) ) == ip2long($net);
    15. }
    16.  
    17. //ЦИКЛ проверки вхождения текущего ИП в СИДРы
    18. $flag = false;
    19. foreach($ip_array as $cur_cidr)
    20. {
    21.   if ((ipCIDRcheck($cur_ip_adrr, $cur_cidr)) == true)
    22.     {$flag = true; break;}  //при первом вхождении установить флаг и выйти из цикла
    23.     else
    24.     {/*может потом что то допишу*/}
    25. }
    26.  
    27. if ($flag == true)
    28.   {echo 'YES';}    //все отлично
    29.   else
    30.   {echo 'NO';}     //принмаем меры к нарушителю
    31. ?>
    Теперь можно критиковать
     
  6. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    садись, Пять!