Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   Php, сравнение Ip (вопрос) (https://forum.antichat.xyz/showthread.php?t=34720)

Химический_Ёжик 05.03.2007 15:51

Php, сравнение Ip (вопрос)
 
Здраствуйте...
Подскажите пожалуйста как можно проверить принадлежит ли ip адрес заданному диапазону?

PHP код:

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

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

GreenBear 05.03.2007 16:03

PHP код:

$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

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

<?
$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

PHP код:

$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

Цитата:

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

Правильно, у каждого своя монера писать код, у кого он большой у мого вобще маленький, кто любит классы кто нет)))

Ch3ck 05.03.2007 19:08

PHP код:

<?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

Цитата:

Сообщение от BlackLogic
PHP код:

        $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 код:

<?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) ? 'Не принадлежит' 'Принадлежит';

?>



Время: 07:35