Php, сравнение Ip (вопрос)

Discussion in 'PHP' started by Химический_Ёжик, 5 Mar 2007.

  1. ZaCo

    ZaCo Banned

    Joined:
    20 Jun 2005
    Messages:
    737
    Likes Received:
    336
    Reputations:
    215
    2BlackLogic ты имеешь представление о хранении целых чисел в памяти? я про современную архитектуру. простой пример, -1 и 255 типа char (один байт) будут выглядеть в памяти одинаково, в то же время (-1<255)==true понимаешь к чему я клоню? ip2long возвращает значение ip адреса (целое знаковое число размером в 4 байта). пхп его обрабатывает и у себя и на более низком уровне сравнивает два знаковых числа, так как в коде пхп они были обьявлены как signed, то сравнение идет уже действительно двух знаковых чисел. и если unsigned результат ip2long был больше (но не более чем на 2^31-1;)) чем 2^31-1 к примеру, то это число считается уже отрицательным. а отрицательное меньше положительного в результате, хотя как тебе кажется - больше ;)
    ---
    кстати, так к слову, если есть число a, то -a получается простой инверсией битов и прибавлением единицы.
     
    #21 ZaCo, 5 Mar 2007
    Last edited: 5 Mar 2007
    3 people like this.
  2. Ch3ck

    Ch3ck Elder - Старейшина

    Joined:
    9 Jun 2006
    Messages:
    1,363
    Likes Received:
    1,192
    Reputations:
    430
    Терь понятно.
    Так как же быть? Кому верить то теперь?! ;)
     
  3. ZaCo

    ZaCo Banned

    Joined:
    20 Jun 2005
    Messages:
    737
    Likes Received:
    336
    Reputations:
    215
    2BlackLogic ну я хз конечно, но учитывая что ни один из приведенных кодов не работает, то видимо мой) тем более такая иллюстрация "алгоритма" предложенного кезом выглядит нагляднее:)
     
  4. Химический_Ёжик

    Joined:
    9 Jan 2007
    Messages:
    9
    Likes Received:
    3
    Reputations:
    8
    Ух... в какие степи вас занесло...
    В общем... Использовал
    Code:
    <?  
    $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 за кривой топик "Сравнение..." но нужно было выяснить именно принадлежность к диапазону...

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

    Elekt Banned

    Joined:
    5 Dec 2005
    Messages:
    944
    Likes Received:
    427
    Reputations:
    508
    http://packetstormsecurity.org/0608-advisories/ip2long.txt

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

    Developer Elder - Старейшина

    Joined:
    3 May 2006
    Messages:
    152
    Likes Received:
    25
    Reputations:
    10
    Вот такой вот скриптик сварганил:

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

    ?>