[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Сравнение ip
tar
Написал такое:

$ip = "121.11.11.15";
$data = "123.11.11.10/123.11.11.22, 124.11.11.11/124.11.11.23, 125.11.11.12/125.11.11.24";
$array = explode(",", $data);

for ( $i=0; $i<=count($array); $i++ )
{

list($from, $to) = split("/", $array[$i]);

if ( sprintf('%u', ip2long($ip)) >= sprintf('%u', ip2long($from)) && sprintf('%u', ip2long($ip)) <= sprintf('%u', ip2long($to)) )

$bad .= "$ip - Bad <br>";

}

echo $bad;


Почему всегда выдает истину ?



Спустя 4 минуты, 9 секунд (21.02.2012 - 18:45) Игорь_Vasinsky написал(а):
чёт я не вкурил для чего такая каша для поиска нужного ip в массиве.

Спустя 4 минуты, 46 секунд (21.02.2012 - 18:50) Игорь_Vasinsky написал(а):
может я не совсем вкурил - сужу по названию темы

<?php
$ip = '198.123.0.10';
$ipList = '230.3.100.30, 230.3.100.30, 230.12.102.30, 230.3.140.30, 231.3.100.33, 198.123.0.10';

$arrIp = explode(',', str_replace(' ','',$ipList));

if(in_array($ip, $arrIp))
echo 'IP is found';
else
echo 'IP no found';
?>

Спустя 32 секунды (21.02.2012 - 18:51) Игорь_Vasinsky написал(а):
а вижу

<?php
$ip = '198.123.0.10';
$ipList = '230.3.100.30/230.3.100.30, 230.3.100.30, 230.12.102.30, 230.3.140.30/230.3.100.30, 231.3.100.33, 198.123.0.10';

preg_match_all("#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#", $ipList, $arrIp);

if(in_array($ip, $arrIp))
echo 'IP is found';
else
echo 'IP no found';
?>


т.е. выбираются все IP и забиваются в массив, потом просто смотрю есть ли совпадение с элементом массива

паттерн полюбому должен быть короче, т.е. его можно сократить

Спустя 5 минут, 41 секунда (21.02.2012 - 18:56) tar написал(а):
Без ip2long не годиться - будет пропускать некоторые адреса.

В моем скрипте как-раз ip2long и не работает правильно.


P.S. preg_match - не уважаю.

Спустя 1 минута, 42 секунды (21.02.2012 - 18:58) nugle написал(а):
tar
чем тебя не устроили регулярки семейства preg?

Спустя 5 минут, 5 секунд (21.02.2012 - 19:03) Игорь_Vasinsky написал(а):
т.е. на сравнимый IP может подставляться как домен и как сконвертированное число?

Спустя 3 минуты, 55 секунд (21.02.2012 - 19:07) tar написал(а):
На сравнимый IP должен подставляться как сконвертированное число.

preg_match - скорость исполнения и безопасность.


Вопрос был и очень интересует - почему не работает.

Спустя 6 минут, 56 секунд (21.02.2012 - 19:14) Игорь_Vasinsky написал(а):
чёт мой перестал работать после этих слов biggrin.gif

Спустя 8 минут, 50 секунд (21.02.2012 - 19:23) Winston написал(а):
Может под себя подправишь http://phpforum.ru/index.php?showtopic=0&v...dpost&p=1477015

Спустя 12 минут, 6 секунд (21.02.2012 - 19:35) tar написал(а):
Вопрос был и очень интересует - почему не работает (Где ошибка ?)

Спустя 16 минут, 29 секунд (21.02.2012 - 19:51) Winston написал(а):
По моему все правильно
Посмотри на конвертированные строки IP/FROM/TO и тогда думаю все поймешь
Свернутый текст
$ip    = "123.11.11.15";
$data = "123.11.11.10/123.11.11.22, 124.11.11.11/124.11.11.23, 125.11.11.12/125.11.11.24";
$array = explode(",", $data);
for ($i = 0; $i < sizeof($array); $i++)
{
list($from, $to) = explode('/', trim($array[$i]));
if ((sprintf('%u', ip2long($ip)) >= sprintf('%u', ip2long($from))) && (sprintf('%u', ip2long($ip)) <= sprintf('%u', ip2long($to))))
echo "<br>----$ip - OK ----<br>";
else
{
echo '<br/>' . sprintf('%u', ip2long($from)) . ' FROM<br/>';
echo '------<br/>' . sprintf('%u', ip2long($ip)) . ' IP<br/>';
echo '<br/>' . sprintf('%u', ip2long($to)) . ' TO<br/>';
echo $from . ' - ' . $to . ' |';
echo "IP - $ip - BAD <br>------";
}
}


Спустя 9 минут, 32 секунды (21.02.2012 - 20:01) tar написал(а):
Огромное спасибо!

Наверное понял - все дело в пробелах в массиве.

Спустя 31 минута, 23 секунды (21.02.2012 - 20:32) tar написал(а):
Было-бы идеально, если-бы в массиве для проверки были и статичные адреса.
Например: $data = "123.11.11.10, 124.11.11.11, 125.11.11.12/125.11.11.24";

Спустя 17 часов, 2 минуты, 57 секунд (22.02.2012 - 13:35) tar написал(а):
Дописал универсальную проверку для диапазона и статичных IP адресов.
Может кому пригодится.
P.S. Еще волнует вопрос как будет работать быстрее - если это запихать в функцию или оставить как есть.

if (!empty($_SERVER['HTTP_CLIENT_IP']))
{
$ip=$_SERVER['HTTP_CLIENT_IP'];
}
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
{
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}
else
{
$ip=$_SERVER['REMOTE_ADDR'];
}
//Прокси
if (strpos($ip, ",") == true)
{
$ips = explode ( "," , $ip ) ;
$ip = trim($ips[1]);
}
$ip_num = sprintf('%u', ip2long($ip));

//Запись в файл 'ip_bad.dat' в конвертированом формате через пробел (вначале тоже):
//Например: > 2013989640 1963658084/1963658090 2003989500 <

$ip_list = file_get_contents("data/ip_bad.dat");

$array = explode(" ", $ip_list);
for ($i = 0; $i < sizeof($array); $i++)
{
if ( strpos($ip_list, $ip_num) )
{
$bad = 1;
}
else
list($from, $to) = explode('/', trim($array[$i]));
if ( ($ip_num >= $from) && ($ip_num <= $to) )
$bad = 1;
}

if ($bad == 1)
{
echo "<br>>>> $ip - Ban <<<< <br>";
exit;
}

Спустя 31 минута (22.02.2012 - 14:06) killer8080 написал(а):
tar
не правильный подход, ip нужно брать из $_SERVER['REMOTE_ADDR'], заголовкам верить нельзя.

Спустя 1 час, 4 минуты, 27 секунд (22.02.2012 - 15:11) tar написал(а):
Действильно только $_SERVER['REMOTE_ADDR'] - спасибо!
Я как-то не задумывался над этим.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.