powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Диапазон IP-адресов вставить в массив
14 сообщений из 14, страница 1 из 1
Диапазон IP-адресов вставить в массив
    #38941082
Pcrepair
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Есть следующая ситуация :

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



Но на самом деле массив ИП-адресов выглядит так 66.231.188.0/24 (для примера), точнее таких массивом много (допустим 10)

Вопрос : как средствами РНР из 66.231.188.0/24 сделать последовательность элементов?
...
Рейтинг: 0 / 0
Диапазон IP-адресов вставить в массив
    #38941098
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IP-адрес - это 32-битное целое. Переведите строковое представление проверяемого и граничных адресов диапазона в числа и выполните пару проверок на больше и меньше.
А строить массив... не знаю, насколько оно оправдано. Особенно, при больших диапазонах.
...
Рейтинг: 0 / 0
Диапазон IP-адресов вставить в массив
    #38941103
Pcrepair
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
оно оправдано, иначе прийдется писать тысячи элементов вручную

кое кто кое где пишет так :

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
$ad_Robots_IP = array(
   'Localhost' => array(
      sprintf('%c%c%c%c', 127, 0, 0, 1),
     sprintf('%c%c%c%c', 255, 255, 255, 255)
   ),
   'Aport'      => array(
      sprintf('%c%c%c%c', 194, 67, 18, 0),
      sprintf('%c%c%c%c', 255, 255, 255, 0)
   ),
);



но что все это значит? а главное как проверить? var_dump выдает :
array(2) { ["Localhost"]=> array(2) { [0]=> string(4) "" [1]=> string(4) "яяяя" } ["Gigabot"]=> array(2) { [0]=> string(4) "Bзј" [1]=> string(4) "яяя" } }
что то не заметно большого числа элементов в виде Ип-адресов?
...
Рейтинг: 0 / 0
Диапазон IP-адресов вставить в массив
    #38941107
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pcrepair,

это форматированный вывод

$ad_Robots_IP = array(
'Localhost' => array(
sprintf('%d.%d.%d.%d', 127, 0, 0, 1),
sprintf('%d.%d.%d.%d', 255, 255, 255, 255)
));
echo "<pre>";
print_r($ad_Robots_IP);
echo "</pre>";
...
Рейтинг: 0 / 0
Диапазон IP-адресов вставить в массив
    #38941110
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab, =)
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
$ad_Robots_IP = array(
		'Localhost' => array(
				sprintf('%d.%d.%d.%d', 127, 0, 0, 1),
				sprintf('%d.%d.%d.%d', 255, 255, 255, 255),
				sprintf('%c.%c.%c.%c', 84, 65, 75, 63 )
		));
echo "<pre>";
print_r($ad_Robots_IP);
echo "</pre>";
...
Рейтинг: 0 / 0
Диапазон IP-адресов вставить в массив
    #38941114
Pcrepair
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
это понятно. но все таки как из 66.231.188.0/24 (или 66.231.188.1 - 66.231.188.255) трансформироваться в массив
66.231.188.1
66.231.188.2
66.231.188.3
66.231.188.4

и так далее до 66.231.188.255

66.231.188.0/24 - это такое представление диапазона адресов эквивалентно 66.231.188.1 - 66.231.188.255
...
Рейтинг: 0 / 0
Диапазон IP-адресов вставить в массив
    #38941129
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pcrepair,

Код: php
1.
2.
3.
4.
5.
$myString = "66.231.188.1";
$myArray = explode(".",$myString);
echo "<pre>";
print_r( $myArray);
echo "</pre>";
...
Рейтинг: 0 / 0
Диапазон IP-адресов вставить в массив
    #38941134
Pcrepair
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
там что то слишком сложно
есть же
if (in_array($cur_ip_adrr, $ip_array))

видимо прийдется в отдельном файле прописать массив массивов как $ip_array
тысяч десять ИП-адресов около. это вообще не будет тормозить веб-сервер?
...
Рейтинг: 0 / 0
Диапазон IP-адресов вставить в массив
    #38941135
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
$myString = "66.231.188.1";
$myArray = explode(".",$myString);
echo "<pre>";
print_r( $myArray);
echo "</pre>";


echo "Begin test01 </br>";
for ($i=0; $i<255; $i++) {
    printf ('%d.%d.%d.%d', $myArray[0], $myArray[1], $myArray[2], $myArray[3]+$i );
    echo "</br>";
}

echo "Begin test02 </br>";

$myIPs = array();
for ($i=0; $i<255; $i++) {
	$myIPs[]= sprintf ('%d.%d.%d.%d', $myArray[0], $myArray[1], $myArray[2], $myArray[3]+$i );
}
echo "<pre>";
print_r($myIPs);
echo "</pre>";
...
Рейтинг: 0 / 0
Диапазон IP-адресов вставить в массив
    #38941136
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pcrepair,

Прочтите уже инструкцию и туеву хучу каментов к ней. Есть там даже решение Вашей исходной задачи.

А хотите упорно строить массив... Для этого вычленяете из описывающей подсеть строки базовую часть адреса и маску, определяете по ним границы диапазона, запускаете цикл от нижней до верхней границ и получаете искомый адрес, который впихивате в свой мега-массив (опять же, инструкция по получению строкового представления из числа).
...
Рейтинг: 0 / 0
Диапазон IP-адресов вставить в массив
    #38941164
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проверим, что сказал vkle

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
// Code:
echo "Begin test03 </br>";
$ip_array = array('192.168.0.1','192.168.0.2','192.168.0.3', '192.168.0.4', '192.168.0.5');

$len = count($ip_map);
$myMap=array();

for ($i=0; $i<$len; $i++) {
	$myMap[ ip2long( $ip_array[$i] ) ] = $ip_array[$i] ;
}

myPrint($myMap, "Mapping number to IP:");

		
function myPrint($arr, $comment="") {
	echo "<br>".$comment."</br>";
	echo "<pre>";
	print_r($arr);
	echo "</pre>";
}	



т.е. получается, что кое-кто использовал UTF-8 (вместо 32-битного числа) для кодировки IP адресов
так или нет?

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
$ad_Robots_IP = array(
   'Localhost' => array(
      sprintf('%c%c%c%c', 127, 0, 0, 1),
     sprintf('%c%c%c%c', 255, 255, 255, 255)
   ),
   'Aport'      => array(
      sprintf('%c%c%c%c', 194, 67, 18, 0),
      sprintf('%c%c%c%c', 255, 255, 255, 0)
   ),
);
...
Рейтинг: 0 / 0
Диапазон IP-адресов вставить в массив
    #38941168
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab,
ASCII (вместо 32-битного числа) для кодировки IP адресов
...
Рейтинг: 0 / 0
Диапазон IP-адресов вставить в массив
    #38942027
Pcrepair
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И вот что получилось :

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
<?php
//массив СИДР чиста для проверки работоспособности
$ip_array = array(
'192.168.0.0/24',    //доступ к серверу из ЛВС
'127.0.0.0/8'        //локальный хост
);

//текущий ИП-адрес посетителя
$cur_ip_adrr = $_SERVER['REMOTE_ADDR'];

//функция определения вхождения ИП в СИДР, спасибо что подсказали
function ipCIDRcheck($ip, $cidr) {
  list($net, $mask) = explode('/', $cidr);
  return ( ip2long($ip) & (-1<<(32-$mask)) ) == ip2long($net);
}

//ЦИКЛ проверки вхождения текущего ИП в СИДРы
$flag = false;
foreach($ip_array as $cur_cidr)
{
  if ((ipCIDRcheck($cur_ip_adrr, $cur_cidr)) == true) 
    {$flag = true; break;}  //при первом вхождении установить флаг и выйти из цикла
    else
    {/*может потом что то допишу*/}
}

if ($flag == true)
  {echo 'YES';}    //все отлично
  else
  {echo 'NO';}     //принмаем меры к нарушителю
?>



Теперь можно критиковать
...
Рейтинг: 0 / 0
Диапазон IP-адресов вставить в массив
    #38942052
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pcrepair,
вроде работает =)
1)по поводу условий: достаточно просто написать: if (condition) {//some code}
например: if ($flag ) {echo 'YES';} else {echo 'NO';}
2) в книжке условное echo записывается так:
echo ($flag) ? 'Yes' : 'No';
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Диапазон IP-адресов вставить в массив
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]