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

Код: 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
20.04.2015, 22:08
    #38941098
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диапазон IP-адресов вставить в массив
IP-адрес - это 32-битное целое. Переведите строковое представление проверяемого и граничных адресов диапазона в числа и выполните пару проверок на больше и меньше.
А строить массив... не знаю, насколько оно оправдано. Особенно, при больших диапазонах.
...
Рейтинг: 0 / 0
20.04.2015, 22:16
    #38941103
Pcrepair
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диапазон 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)
   ),
);



но что все это значит? а главное как проверить? 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
20.04.2015, 22:27
    #38941107
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диапазон IP-адресов вставить в массив
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
20.04.2015, 22:37
    #38941110
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диапазон IP-адресов вставить в массив
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
20.04.2015, 22:41
    #38941114
Pcrepair
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диапазон IP-адресов вставить в массив
это понятно. но все таки как из 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
20.04.2015, 23:00
    #38941129
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диапазон IP-адресов вставить в массив
Pcrepair,

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

видимо прийдется в отдельном файле прописать массив массивов как $ip_array
тысяч десять ИП-адресов около. это вообще не будет тормозить веб-сервер?
...
Рейтинг: 0 / 0
20.04.2015, 23:16
    #38941135
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диапазон IP-адресов вставить в массив
Код: 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
20.04.2015, 23:17
    #38941136
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диапазон IP-адресов вставить в массив
Pcrepair,

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

А хотите упорно строить массив... Для этого вычленяете из описывающей подсеть строки базовую часть адреса и маску, определяете по ним границы диапазона, запускаете цикл от нижней до верхней границ и получаете искомый адрес, который впихивате в свой мега-массив (опять же, инструкция по получению строкового представления из числа).
...
Рейтинг: 0 / 0
21.04.2015, 00:36
    #38941164
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диапазон IP-адресов вставить в массив
проверим, что сказал 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
21.04.2015, 00:41
    #38941168
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диапазон IP-адресов вставить в массив
mini.weblab,
ASCII (вместо 32-битного числа) для кодировки IP адресов
...
Рейтинг: 0 / 0
21.04.2015, 21:29
    #38942027
Pcrepair
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диапазон IP-адресов вставить в массив
И вот что получилось :

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


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