Счетчики и IP пользователя

TAHK

Новичок
Счетчики и IP пользователя

Есть проблемки с определениями IP пользователей, которые посетили страницу с счетчиком.

Для получения IP использую вот такой вот код:
PHP:
	function getIp() { 
        $client_ip = isset($_SERVER['HTTP_CLIENT_IP'])?$_SERVER['HTTP_CLIENT_IP'] : ""; 
        $x_forwarded_for = isset($_SERVER['HTTP_X_FORWARDED_FOR'])? 
           $_SERVER['HTTP_X_FORWARDED_FOR'] : ""; 
        $remote_addr = $_SERVER['REMOTE_ADDR']; 
        if (!empty ($client_ip) ) { 
            $ip_expl = explode('.',$client_ip); 
            $referer = explode('.',$remote_addr); 
            if ($referer[0] != $ip_expl[0]) { 
                $ip=array_reverse($ip_expl); 
                $ret=implode('.',$ip); 
            } else { 
                $ret = $client_ip; 
            }; 
        } elseif (!empty($x_forwarded_for) ) { 
            if (strstr($x_forwarded_for,',')) { 
                $ip_expl = explode(',',$x_forwarded_for); 
                $ret = end($ip_expl); 
            } else { 
                $ret = $x_forwarded_for; 
            }; 
        } else { 
          $ret = $remote_addr; 
        }; 
        return $ret; 
    }
Все бы хорошо, но иногда нат не отдает внешний IP а только внутренний. Вопрос - можно ли это как-то обойти и как с этим бороться. :) Вариант не считать таких пользователей не канает.
 

TAHK

Новичок
Фанат
Не оригинально. Другого не ожидал услышать, а какой код использовать??? с php.net??? - так это оттуда )
 

Фанат

oncle terrible
Команда форума
а какой код использовать???
$remote_addr = $_SERVER['REMOTE_ADDR'];

-~{}~ 18.08.06 13:38:

с php.net??? - так это оттуда )
это не с php.net.
это из комментариев на php.net.
если ты не понимаешь разницы - мне тебя жаль.
иногда нат не отдает внешний IP а только внутренний
чей нат?
что значит - иногда?
 

TAHK

Новичок
Фанат

$remote_addr = $_SERVER['REMOTE_ADDR'];
а прокся?

это не с php.net.
это из комментариев на php.net.
если ты не понимаешь разницы - мне тебя жаль.
ну извени, можешь меня пожалеть и прислать мне на мыло ПХП мануал

чей нат?
что значит - иногда?
ну не мой же... то и значит, что в зависимости от настроек, он не отдает внешний IP, а только внутренний... я подозреваю, что это обойти никак нельзя, но спросить то можно ;)
 

Фанат

oncle terrible
Команда форума

TAHK

Новичок
Фанат
Все люди ошибаются... прости характер у меня плохой )
Я прекрасно понимаю, разницу между самим мануалом и комментариями к ним )))

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

А вот например только что протестил твое предложение - вот результат:
23 255.255.255.255 255.255.255.255 18.08.2006 12:46:48 Opera/9.00 (X11; Linux i686; U; ru)
24 255.255.255.255 255.255.255.255 18.08.2006 12:46:53 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
25 255.255.255.255 255.255.255.255 18.08.2006 12:46:54 Opera/9.00 (X11; Linux i686; U; ru)

Ну не ловит оно так IP, если бы я просто так такой себе геморой на голову придумал, вопросов бы не было...
 

Фанат

oncle terrible
Команда форума
что это такое ты мне здесь написал?

-~{}~ 18.08.06 14:05:

судя по всему - какие-то самопальные логи.
в которые пишется REMOTE_ADDR
в котором лежит мусор.

и ты полагаешь, что гадский нат клиента подпихивает в виде адреса вот эту бяку?
 

TAHK

Новичок
Фанат
Результат )) первый IP - это как раз значение $_SERVER['REMOTE_ADDR'];
дальше все ловит нормально, но вот адрес ни в какую, пришлось извращатся...

Ладно, не важно... вопрос в другом, как это сделать ПРАВИЛЬНО ($_SERVER['REMOTE_ADDR'] - это правильно, но не всегда работает)

Я знаю, что так как я сделал тоже не правильно, и тоже не вседа работает, но этот вариант дает самые лучшие результаты... :confused:

-~{}~ 18.08.06 13:11:

Фанат
Отож, что логи самопальные )))
Ну по крайней мере это самое вразумительное объяснение, которое мне удалось выбить из своих админов... а в $_SERVER['HTTP_X_FORWARDED_FOR'] он ложит только внутренний адрес - 192.168....
 

Фанат

oncle terrible
Команда форума
Сделать - очень просто.
если понимать, что делаешь.
если понимать, что клиентский нат В ПРИНЦИПЕ не может "нагадить" таким образом. Поскольку таким образом он нагадит только себе.
Это напоминает мне предыдущего клиента, который собрался подделывать заголовок "Host" в запросе. ага. обманул всех.

REMOTE_ADDR - это адрес, с которого произошло соединение с сервером.
если там мусор - значит, единственный, кто мог написать этот мусор - это ТВОЙ ПРОВАЙДЕР!
поэтому, действия очень простые.
1. запускаешь пхпинфо и ищешь, в какой переменной лежит привильный ремоте аддр.
2. если не находишь - стучишь в репу провайдеру, чтобы положил.
Всё.
остальное - это звездосины слёзы и дудовые рыдания.
 

TAHK

Новичок
Фанат

пхп инфо пускал - нету правильного ремоте аддра там...
Стучишь в репу провайдеру = в моем случаи стучишь в репу себе (точнее админам) :)

И все равно, остается открытый вопрос с прокси, $_SERVER['HTTP_X_FORWARDED_FOR'] используется как раз для этого случая же... насколько я это понимаю... и как я понимаю, в некоторых случаях, как раз клиетский шлюз отдает мне $_SERVER['HTTP_X_FORWARDED_FOR'] только со своим внутренним IP без внешнего, из-за чего вполне возможна бяка в $_SERVER['REMOTE_ADDR']. Просто никак не могу выловить причину такого странного поведения. Ладно, пошел стучать в репу админам)
 

Фанат

oncle terrible
Команда форума
$_SERVER['HTTP_X_FORWARDED_FOR'] используется как раз для этого случая же... насколько я это понимаю...
ты неправильно это понимаешь.
HTTP_X_FORWARDED_FOR используется совсем не для этого.

админы, если засунули тебя куда-то в задницу, ОБЯЗАНЫ пробросить тебе туда же REMOTE_ADDR, пусть и с другим именем.
причём имя это НЕ ДОЛЖНО быть HTTP_X_FORWARDED_FOR.

-~{}~ 18.08.06 14:28:

и всё остальное фуфло, типа 'HTTP_CLIENT_IP' не имеет к твоей задаче никакого отношения.

если ты в базу идёт IP адрес, то это должен быть ремоте аддр и ничего больше.
 

TAHK

Новичок
Фанат
$_SERVER['HTTP_X_FORWARDED_FOR'] contains the proxy behind the nat router.
правда с коментариев с пхп.нет, но все равно есть основания этому доверять. так вот, есть вариант, шо роутер отдает в мир адреса, так как будто все идут через проксю, прячет свой IP и отдает только внутренний IP машины... просто так же переменная $_SERVER['HTTP_X_FORWARDED_FOR'] не появится....
 

Фанат

oncle terrible
Команда форума
какой роутер?
в схеме клиент - твой скрипт, где он стоит?
 

SiMM

Новичок
TAHK, я тебе в этот X_FORWARDED_FOR что хошь засуну, если его ТВОЙ сервер не изменит.
 

TAHK

Новичок
Фанат
У клиента.

-~{}~ 18.08.06 13:32:

SiMM
хм... логика присутствует, но я же как-то вылавливаю в X_FORWARDED_FOR реальные внутренние адреса машин, при этом имея полную лажу в REMOTE_ADDR
 

Black Raven

Новичок
Помоему ТАНКу стоит почитать как работают интернет, нат и прокся.
 

Фанат

oncle terrible
Команда форума
TAHK
тебе не нужна переменная 'HTTP_X_FORWARDED_FOR'
если ты ещё этого до сих пор не понял
 

TAHK

Новичок
Фанат
Да понял я, понял... я просто уже все варианты пересматриваю какие возможно... чего и решил спросить...
Хоть кинь ссылку где это можно НОРМАЛЬНО почитать, а то в разных местах по разному описано... (

Black Raven
Обязательно почитаю на досуге... как только закончу Squid поднимать шоб дальше тестировать...
 
Сверху