Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Получение IP адреса


Автор: NNaarreekk 30.7.2007, 11:38
Код

<?
function _tst_ip($env)
{
    if (($ip = getenv($env)) === false) return false;
    $i = ip2long($ip);
    if ($i === false || $i == -1 || $i == 0) return false;
    // RFC 1819
    // Class A: 10.0.0.0 - 10.255.255.255
    // Class B: 172.16.0.0 - 172.31.255.255
    // Class C: 192.168.0.0 - 192.168.255.255
    $a = ($i >> 24) & 0xFF;
    $b = ($i >> 16) & 0xFFFF;
    if (($a == 0x0A) || ($b == 0xC0A8) ||
            ($b >= 0xAC10 && $b <= 0xAC1F)) return false;
    return $ip;
}

function get_ip()
{
    if (($ip = _tst_ip('HTTP_CLIENT_IP')) !== false) return $ip;
    if (($ip = _tst_ip('HTTP_X_FORWARDED_FOR')) !== false) return $ip;
    if (($ip = _tst_ip('HTTP_X_FORWARDED')) !== false) return $ip;
    if (($ip = _tst_ip('HTTP_FORWARDED_FOR')) !== false) return $ip;
    if (($ip = _tst_ip('HTTP_FORWARDED')) !== false) return $ip;
    return $_SERVER['REMOTE_ADDR'];
}

$xxx=get_ip();
echo $xxx;
?>


Есть такой код!

В прицыпе не плохой код но, у меня на работе лоцальная сеть есть и на всех компах один и тотже IP!

От чего же так скажите пожалуста?
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-

Если так надо то как мы скажем в голосованиях можем отдельно участвовать?

Автор: Fally 30.7.2007, 13:07
А ты не пробывал на каждом из компов в сети выполнить команду ipconfig и посмотреть, какие у них внутренние и внешние IP??

Автор: NNaarreekk 30.7.2007, 15:18
Цитата(Fally @ 30.7.2007,  13:07)
А ты не пробывал на каждом из компов в сети выполнить команду ipconfig и посмотреть, какие у них внутренние и внешние IP??

Может конечно я туповат, но ни слова ни понял из вышетобоюсказонного (хорошее слово я выдумал smile).....

Но если чтото ни так, то в других сайтах тоже должны быть IP одинаковыми, что ни так....

То есть пришли к противаречию!

Автор: Rezzonans 30.7.2007, 16:08
Код


<?

function get_ip()
{

$err = "Sorry, Ip don't fined";

    if ($_SERVER['REMOTE_ADDR'] !== false)
     {
         return $_SERVER['REMOTE_ADDR'];
     }else{
         return $err;
     }

}

$xxx=get_ip();
echo $xxx;
?>



Вот так попробуй. А то функция твоя - явный велосипед smile

Добавлено через 4 минуты и 20 секунд
или вот так ещё можно:
Код


<?

function get_ip()
{

$err = "Sorry, Ip don't fined";

    if ($_SERVER['REMOTE_ADDR'] !== false)
     {

         return $_SERVER['REMOTE_ADDR'];

     }else if( $_SERVER['HTTP_X_FORWARDED'] !== false )
     {

         return $_SERVER['HTTP_X_FORWARDED'];

     }else{

         return $err;

     }

}

$xxx=get_ip();
echo $xxx;
?>


Автор: Flashdown 30.7.2007, 16:46
Цитата(NNaarreekk @ 30.7.2007,  11:38)
у меня на работе лоцальная сеть есть и на всех компах один и тотже IP!

От чего же так скажите пожалуста?

ты сам то вообще понял что спросил? это мы чтоль знать должны почему у тебя на работе айпишники одинаковые?))

Автор: sTa1kEr 30.7.2007, 18:35
Цитата(Rezzonans @  30.7.2007,  16:08 Найти цитируемый пост)
А то функция твоя - явный велосипед smile

Вообще-то функция NNaarreekk достаточно грамотная, т.к. проверяется валидность IP, а так-же заголовки, которые может заполнять Proxy-сервер.

NNaarreekk
Цитата(NNaarreekk @  30.7.2007,  11:38 Найти цитируемый пост)
    $a = ($i >> 24) & 0xFF;
    $b = ($i >> 16) & 0xFFFF;
    if (($a == 0x0A) || ($b == 0xC0A8) ||
            ($b >= 0xAC10 && $b <= 0xAC1F)) return false;

Эти строчки исключают локальные IP адреса, что очень правильно для внешних internet серверов, но совершенно не годится в вашем случае. Т.к., на сколько я понял, нужны именно локальные IP для внутри-сетевого сайта. По этому если прокси-сервер действительно используется, то этот скрипт пропустит локальные IP. Попробуйте за комментировать эти строчки.

Так же, один и тот же IP может быть если для доступа к серверу, на котором расположен этот скрипт, используется NAT-маршрутизация или прокси сервер анонимный. Увы, в этом случае ничего сделать не удастся (разве что подойти к сисадмину и высказать ему все что вы о нем думаете smile).

Цитата(Rezzonans @  30.7.2007,  16:08 Найти цитируемый пост)
$err = "Sorry, Ip don't fined";

+1 smile А как это правильно перевести? Что-нибудь вроде "Извините, IP не становится прекрасным"? smile

Автор: gambit 30.7.2007, 21:33
Цитата(Flashdown @  30.7.2007,  16:46 Найти цитируемый пост)
Цитата(NNaarreekk @ 30.7.2007,  11:38)
Цитата

у меня на работе лоцальная сеть есть и на всех компах один и тотже IP!

От чего же так скажите пожалуста?

ты сам то вообще понял что спросил? это мы чтоль знать должны почему у тебя на работе айпишники одинаковые?))


 smile Ребята может я чегото не понял, но объясните КАК в сети могут быть одинаковые ip???  smile 
Это один большой конфликт.

Автор: NNaarreekk 31.7.2007, 01:06
gambit  когда пишу echo $_SERVER['REMOTE_ADDR'];

С всех компов одно и тоже показывает:-(

Автор: sTa1kEr 31.7.2007, 06:05
Цитата(gambit @  30.7.2007,  21:33 Найти цитируемый пост)
Ребята может я чегото не понял, но объясните КАК в сети могут быть одинаковые ip???   
Это один большой конфликт. 

Смысл не в том, что IP у всех одинаковые, а в том, что на сервер все пакеты приходят с одним и тем же исходным IP. Это может быть, как я уже сказал, при использовании прокси сервера или http://ru.wikipedia.org/wiki/NAT
Цитата

Суть механизма состоит в замене обратного (source) адреса при прохождении пакета в одну сторону и обратной замене адреса назначения (destination) в ответном пакете.


NNaarreekk, сделайте дамп всех серверных заголовков и поищите там наличие одного из заголовков 'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_FORWARDED', 'HTTP_VIA'. Если ни один из них не присутствует, то тогда буде проблематично определить IP.

Автор: Rezzonans 31.7.2007, 08:15
Цитата
+1  А как это правильно перевести? Что-нибудь вроде "Извините, IP не становится прекрасным"? 


это вам +1 про прекрасный ip. Я, хотя, ещё тот мудрец в английском (и знаю, что написано с ошибкой), но до такого не додумался smile Хотел написать извините, ип не найден, но к, несчастью, из головы вылетело слово found, так что получилось нечто вроде извените ип оштрафован. Ну а профункцию: просто раньше программировал на перле, в котором достучаться до переменных окружения можно через небезизвестный массив $ENV. Когда с такой задачкой сталкивался впервые нашёл мануал, в котором было сказано, что ип адрес можно найти в переменной окружения под названием REMOTE_ADDR, в случае использования проксисервера существует переменная HTTP_X_FORWARDED, в которой может содержаться название проксисервера. Мне как-то этого обычно хватало. Вообщем-то таким же путём просто можно бы было проверить и все остальные переменные, думаю это очевидно. Опять таки нет мудрежа с локальными ип

Автор: NNaarreekk 31.7.2007, 12:01
Захожу на этот форум и стыдно становится с людми разговаривать(чуствую себя полным дебилом)!

sTa1kEr, а как это дамп сделать? smile 

Автор: Golda 31.7.2007, 13:57
print_r($_SERVER);

Автор: NNaarreekk 31.7.2007, 22:50
Golda, спасибо всю жизнь благодарен тебе буду(если конечно поможет smile )

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)