PDA

Просмотр полной версии : Php, сравнение Ip (вопрос)


Химический_Ёжик
05.03.2007, 15:51
Здраствуйте...
Подскажите пожалуйста как можно проверить принадлежит ли ip адрес заданному диапазону?


<?
$s="$REMOTE_ADDR";
if (?????) {
echo "yes!";
}
else {
echo "No!";
?>


Если криво задал вопрос, скажите- перефразирую :))
сорри за глупые вопросы, умные пока придумать не могу... :confused:

GreenBear
05.03.2007, 16:03
$check_ip = explode('.', "127.0.0.2");
$user_ip = explode('.', $_SERVER['REMOTE_ADDR']);
for($i=0;$i<4;$i++){
if (($check_ip[$i] == $user_ip[$i]) OR $check_ip[$i] == "*") $do = true;
else {$do = false; break; }
}
if($do) echo 'yes';
else echo 'no';

KEZ
05.03.2007, 16:04
пусть $d1 и $d2 - диапазоны в виде "x.x.x.x" (например 1.2.3.4 - 1.2.3.100)
переводи их в числа (4-байтные как бы) чтобы небыло никаких точек. просто числа.
далее переводи в такое же число заданый адрес, и если
конец_диапазона >= заданый_адрес >= начало_диапазона
то yes, иначе нет.


UPD
поскольку коллега Green_Bear успел написать ответ быстрее меня, читай его код (правда я неуверен что он правильный)

KEZ
05.03.2007, 16:10
надо было уточнить как задан диапазон
уточняй сразу что нужно и пиши пример так:

<?
$d1 = "1.2.3.4"; $d2 = "1.2.3.10"; # или по другому, как хотел то?

$s=$_SERVER["REMOTE_ADDR"]; # так правильнее
if (?????)
{
echo "yes!";
}
else
{
echo "No!";
} # забыл "}"
?>

GreenBear
05.03.2007, 16:13
кез, а чо там не правильного? поставить * за место цифры =)) например 127.0.*.*
и все =\
правда я не учел, что твое... например 127.0.0.1 - 127.0.0.15 =\
но это уже надо более точно узнать у автора топика, что ему конкретно надо.

TaNkist
05.03.2007, 16:26
$text="$REMOTE_ADDR";
$text=strrev($text);
$last =strchr($text, ".");
$last =strrev($last);
if ($last=="127.0.0.") {
echo "yes!";
}
else {
echo "No!";

ZaCo
05.03.2007, 18:31
2GreenBear твой код неправильный. сравнивать символы на равенство?)
2TaNkist это вообще что?
2BlackLogic а это что?
--
вообще советую перечитывать свои сообщения перед постом.
ЗЫ сегодня победил кез.

GreenBear
05.03.2007, 18:34
покажи правильное.

ZaCo
05.03.2007, 18:39
тк в пхп тип Integer по-умолчанию знаковый и ip2long может вернуть отрицательное значение, то делаем так:

<?
$first="0.0.0.0";
$last="255.255.255.254";
$check="192.0.34.166";
//
$check_d=sprintf("%u",ip2long($check));
$first_d=sprintf("%u",ip2long($first));
$last_d=sprintf("%u",ip2long($last));
//
if( ($check_d>=$first_d) && ($check_d<=$last_d) )
{
//xek
echo 'xek';
}
?>

самому не нравится...

GreenBear
05.03.2007, 18:41
ну у каждой задачи есть множесвто решений. так что если ты делаешь по другому, то не значит что у других не правильно :)
другое дело, что я вопрос не правильно понял =). .. как уже написал выше.

Ch3ck
05.03.2007, 18:45
2 GreenBear
Нет... Как раз у него всё правильно.
Блин, только допечатал, а он уже написал.
Свой пример удалил.

GreenBear
05.03.2007, 18:48
ну хорошо я буду делать только так, как делает зако. п***ец

Ch3ck
05.03.2007, 18:53
ну хорошо я буду делать только так, как делает зако. п***ец
Причём тут делать как он?
Всякие там функции типа
_http://php.net/ip2long
_http://php.net/long2ip
использовать намного правильнее нежели эм.м.. другое...вот.

GreenBear
05.03.2007, 18:55
мда... у меня работает код? - да. тогда хули вы прикопались как он работает? =((
оцтаньте.
как хачу, так и пешу.

DIAgen
05.03.2007, 19:03
мда... у меня работает код? - да. тогда хули вы прикопались как он работает? =((
оцтаньте.
как хачу, так и пешу.
Правильно, у каждого своя монера писать код, у кого он большой у мого вобще маленький, кто любит классы кто нет)))

Ch3ck
05.03.2007, 19:08
<?php
function checkIPorRange ($ip, $ip_address) {
if (ereg("-",$ip_address)) {
$ar = explode("-",$ip_address);
$your_long_ip = ip2long($ip);
if ( ($your_long_ip >= ip2long($ar[0])) && ($your_long_ip <= ip2long($ar[1])) ) {
return TRUE;
}
} else {
if ($ip == $ip_address) {
return TRUE;
}
}
return FALSE;
}
$ip_range = "210.100.55.25-214.43.244.17";

if (checkIPorRange($_SERVER["REMOTE_ADDR"], $ip_range)) echo "принадлежит!";
else echo "Нееет";
?>
Блин, никто не накого не наезжаетъ, и ничего не говорит про его код. Сказали как правильнее...

ZaCo
05.03.2007, 19:17
2BlackLogic код у тебя некорректный ;)

Ch3ck
05.03.2007, 19:23
2BlackLogic код у тебя некорректный ;)
Мне плохо уже...
Пусть он любой берёт. Все примеры работают.

ZaCo
05.03.2007, 19:29
>>Пусть он любой берёт. Все примеры работают.
твой код НЕ работает, потому что например 10>-9, но сдвинем по кругу и что тогда? ;)

Ch3ck
05.03.2007, 20:44
твой код НЕ работает, потому что например 10>-9, но сдвинем по кругу и что тогда?
Вот у меня щас лицо такое же как на аве.
У меня всё работает прекрасно. В чём проблема-то. Объясни тогда подоступнее...

ZaCo
05.03.2007, 23:04
2BlackLogic ты имеешь представление о хранении целых чисел в памяти? я про современную архитектуру. простой пример, -1 и 255 типа char (один байт) будут выглядеть в памяти одинаково, в то же время (-1<255)==true понимаешь к чему я клоню? ip2long возвращает значение ip адреса (целое знаковое число размером в 4 байта). пхп его обрабатывает и у себя и на более низком уровне сравнивает два знаковых числа, так как в коде пхп они были обьявлены как signed, то сравнение идет уже действительно двух знаковых чисел. и если unsigned результат ip2long был больше (но не более чем на 2^31-1;)) чем 2^31-1 к примеру, то это число считается уже отрицательным. а отрицательное меньше положительного в результате, хотя как тебе кажется - больше ;)
---
кстати, так к слову, если есть число a, то -a получается простой инверсией битов и прибавлением единицы.

Ch3ck
05.03.2007, 23:08
Терь понятно.
Так как же быть? Кому верить то теперь?! ;)

ZaCo
05.03.2007, 23:16
2BlackLogic ну я хз конечно, но учитывая что ни один из приведенных кодов не работает, то видимо мой) тем более такая иллюстрация "алгоритма" предложенного кезом выглядит нагляднее:)

Химический_Ёжик
06.03.2007, 17:28
Ух... в какие степи вас занесло...
В общем... Использовал

<?
$first="0.0.0.0";
$last="255.255.255.254";
$check="192.0.34.166";
//
$check_d=sprintf("%u",ip2long($check));
$first_d=sprintf("%u",ip2long($first));
$last_d=sprintf("%u",ip2long($last));
//
if( ($check_d>=$first_d) && ($check_d<=$last_d) ) {
//xek
echo 'xek'; }
?>

этот способ... (ИМХО самый короткий и понятный)

Рассматривал только те примеры в которых идет выборка ip из диапазона :))
Sorry за кривой топик "Сравнение..." но нужно было выяснить именно принадлежность к диапазону...

ВСЕМ спасибо за ответы...

Elekt
09.03.2007, 08:14
$your_long_ip = ip2long($ip);
if ( ($your_long_ip >= ip2long($ar[0])) && ($your_long_ip <= ip2long($ar[1])) ) {


http://packetstormsecurity.org/0608-advisories/ip2long.txt

ip2long - не самый безопасный способ. только если кроме REMOTE_ADDR не будет больше ничего передаваться.

Developer
27.04.2007, 21:48
Вот такой вот скриптик сварганил:

<?php

$ip = '10.10.10.10';

$bZone = array('10', '10', '1', '1');
$eZone = array('10', '10', '255', '255');

$info = explode('.', $ip);
$error = 0;

for ($i = 0; $i < 4; $i++) {
if (!($info[$i] >= $bZone[$i] && $info[$i] <= $eZone[$i])) {
$error = 1;
continue;
}
}

echo ($error) ? 'Не принадлежит' : 'Принадлежит';

?>