Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » PHP: Качественное определение IP посетителя.

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

Farkhad



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите...




Вынес язык в название. — Svarga.

Всего записей: 731 | Зарегистр. 03-08-2001 | Отправлено: 22:49 06-05-2004 | Исправлено: Svarga, 00:39 07-05-2004
Mamay



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
И что тут подсказывать?

Код:
$_SERVER['REMOTE_ADDR']


----------
Даже самый дурацкий замысел можно выполнить мастерски

Всего записей: 1352 | Зарегистр. 03-09-2002 | Отправлено: 23:00 06-05-2004
Svarga

Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А на каком языке?
 
Perl:
Цитата:
$ip=$ENV{HTTP_X_FORWARDED_FOR}||$ENV{REMOTE_ADDR}||'cmd';
$proxy=($ENV{HTTP_X_FORWARDED_FOR} || $ENV{HTTP_VIA} || $ENV{HTTP_PROXY_CONNECTION}) ?
  "$ENV{REMOTE_ADDR}|$ENV{HTTP_X_FORWARDED_FOR}|$ENV{HTTP_VIA}|$ENV{HTTP_PROXY_CONNECTION}":0;

что-то типа того ($proxy — чтоб если прокси не передаёт HTTP_X_FORWARDED_FOR, но передаёт что-то ещё можно было понять, что это прокси), 'cmd' — на всяк случай, если надо фиксировать запуск скрипта в командной строке ...
 
 
Кстати, близкая тема есть... Сейчас...
 
Добавлено
Вот: алгоритм определения уникального посетителя
 
Добавлено
вот ещё:
$HTTP_X_COMING_FROM, $HTTP_FORWARDED
http://www.cgsa.net/php/identifierShow.php
 
а вообще, где-то встречал довольно большой список переменных окружения, которые передаются разными типами прокси-серверов...
 
Добавлено
 
$ENV{CLIENT_IP}
$ENV{HTTP_CLIENT_IP}
$ENV{HTTP_X_COMING_FROM}
$ENV{HTTP_FROM}
HTTP_SP_HOST
HTTP_X_LOCKING
HTTP_CACHE_INFO
HTTP_CACHE_CONTROL
HTTP_PROXY_AUTHORIZATION
HTTP_XROXY_CONNECTION
HTTP_X_LOOKING
HTTP_XONNECTION
 
и т. п.  
 
 
Вот нечто злобное на PHP подвернулось:

Цитата:
function get_real_IP() {
global  $HTTP_VIA  
      , $HTTP_X_COMING_FROM  
      , $HTTP_CLIENT_IP
      , $HTTP_X_FORWARDED_FOR  
      , $HTTP_X_FORWARDED
      , $HTTP_COMING_FROM  
      , $HTTP_FORWARDED_FOR  
      , $HTTP_FORWARDED
  , $REMOTE_HOST
      , $REMOTE_ADDR ;
 
if($HTTP_X_FORWARDED_FOR) { // case 1.A: proxy && HTTP_X_FORWARDED_FOR is defined
$array = extractIP($HTTP_X_FORWARDED_FOR);
if ($array && count($array) >= 1) {
return $array[0]; // first IP in the list
}
}
if($HTTP_X_FORWARDED) { // case 1.B: proxy && HTTP_X_FORWARDED is defined
$array = extractIP($HTTP_X_FORWARDED);
if ($array && count($array) >= 1) {
return $array[0]; // first IP in the list
}
}
if($HTTP_FORWARDED_FOR) { // case 1.C: proxy && HTTP_FORWARDED_FOR is defined
$array = extractIP($HTTP_FORWARDED_FOR);
if ($array && count($array) >= 1) {
return $array[0]; // first IP in the list
}
}
if($HTTP_FORWARDED) { // case 1.D: proxy && HTTP_FORWARDED is defined
$array = extractIP($HTTP_FORWARDED);
if ($array && count($array) >= 1) {
return $array[0]; // first IP in the list
}
}
if($HTTP_CLIENT_IP) { // case 1.E: proxy && HTTP_CLIENT_IP is defined
$array = extractIP($HTTP_CLIENT_IP);
if ($array && count($array) >= 1) {
return $array[0]; // first IP in the list
}
}
/*
if($HTTP_VIA) {
// case 2:  
// proxy && HTTP_(X_) FORWARDED (_FOR) not defined && HTTP_VIA defined
// other exotic variables may be defined  
return ( $HTTP_VIA .  
            '_' . $HTTP_X_COMING_FROM .
            '_' . $HTTP_COMING_FROM    
          ) ;
}
if( $HTTP_X_COMING_FROM || $HTTP_COMING_FROM ) {
// case 3: proxy && only exotic variables defined
// the exotic variables are not enough, we add the REMOTE_ADDR of the proxy
return ( $REMOTE_ADDR .  
            '_' . $HTTP_X_COMING_FROM .
            '_' . $HTTP_COMING_FROM    
          ) ;
}
*/
 
// case 4: no proxy (or tricky case: proxy+refresh)
if($REMOTE_HOST) {
$array = extractIP($REMOTE_HOST);
if ($array && count($array) >= 1) {
return $array[0]; // first IP in the list
}
}
 
return $REMOTE_ADDR;
}


----------
away.

Всего записей: 4161 | Зарегистр. 25-06-2002 | Отправлено: 23:13 06-05-2004
Farkhad



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
На каком языке указано в описании темы.
Svarga
спасибо, будем додумывать ф-ию extractIP()...

Всего записей: 731 | Зарегистр. 03-08-2001 | Отправлено: 00:31 07-05-2004
Svarga

Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Farkhad

Цитата:
На каком языке указано в описании темы.  

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


----------
away.

Всего записей: 4161 | Зарегистр. 25-06-2002 | Отправлено: 00:41 07-05-2004 | Исправлено: Svarga, 08:02 17-05-2004
IntenT



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Есть один из лучшх способов определения ИП - в phpMyAdmin

Всего записей: 1584 | Зарегистр. 16-12-2001 | Отправлено: 09:43 07-05-2004
jvalej

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот это вроде то о чём написал IntenT
Взято из phpMyAdmin 2.5.6 файла ip_allow_deny.lib.php
 

Цитата:
function PMA_getIp()
{
    global $REMOTE_ADDR;
    global $HTTP_X_FORWARDED_FOR, $HTTP_X_FORWARDED, $HTTP_FORWARDED_FOR, $HTTP_FORWARDED;
    global $HTTP_VIA, $HTTP_X_COMING_FROM, $HTTP_COMING_FROM;
 
    // Get some server/environment variables values
    if (empty($REMOTE_ADDR)) {
        if (!empty($_SERVER) && isset($_SERVER['REMOTE_ADDR'])) {
            $REMOTE_ADDR = $_SERVER['REMOTE_ADDR'];
        }
        else if (!empty($_ENV) && isset($_ENV['REMOTE_ADDR'])) {
            $REMOTE_ADDR = $_ENV['REMOTE_ADDR'];
        }
        else if (@getenv('REMOTE_ADDR')) {
            $REMOTE_ADDR = getenv('REMOTE_ADDR');
        }
    } // end if
    if (empty($HTTP_X_FORWARDED_FOR)) {
        if (!empty($_SERVER) && isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $HTTP_X_FORWARDED_FOR = $_SERVER['HTTP_X_FORWARDED_FOR'];
        }
        else if (!empty($_ENV) && isset($_ENV['HTTP_X_FORWARDED_FOR'])) {
            $HTTP_X_FORWARDED_FOR = $_ENV['HTTP_X_FORWARDED_FOR'];
        }
        else if (@getenv('HTTP_X_FORWARDED_FOR')) {
            $HTTP_X_FORWARDED_FOR = getenv('HTTP_X_FORWARDED_FOR');
        }
    } // end if
    if (empty($HTTP_X_FORWARDED)) {
        if (!empty($_SERVER) && isset($_SERVER['HTTP_X_FORWARDED'])) {
            $HTTP_X_FORWARDED = $_SERVER['HTTP_X_FORWARDED'];
        }
        else if (!empty($_ENV) && isset($_ENV['HTTP_X_FORWARDED'])) {
            $HTTP_X_FORWARDED = $_ENV['HTTP_X_FORWARDED'];
        }
        else if (@getenv('HTTP_X_FORWARDED')) {
            $HTTP_X_FORWARDED = getenv('HTTP_X_FORWARDED');
        }
    } // end if
    if (empty($HTTP_FORWARDED_FOR)) {
        if (!empty($_SERVER) && isset($_SERVER['HTTP_FORWARDED_FOR'])) {
            $HTTP_FORWARDED_FOR = $_SERVER['HTTP_FORWARDED_FOR'];
        }
        else if (!empty($_ENV) && isset($_ENV['HTTP_FORWARDED_FOR'])) {
            $HTTP_FORWARDED_FOR = $_ENV['HTTP_FORWARDED_FOR'];
        }
        else if (@getenv('HTTP_FORWARDED_FOR')) {
            $HTTP_FORWARDED_FOR = getenv('HTTP_FORWARDED_FOR');
        }
    } // end if
    if (empty($HTTP_FORWARDED)) {
        if (!empty($_SERVER) && isset($_SERVER['HTTP_FORWARDED'])) {
            $HTTP_FORWARDED = $_SERVER['HTTP_FORWARDED'];
        }
        else if (!empty($_ENV) && isset($_ENV['HTTP_FORWARDED'])) {
            $HTTP_FORWARDED = $_ENV['HTTP_FORWARDED'];
        }
        else if (@getenv('HTTP_FORWARDED')) {
            $HTTP_FORWARDED = getenv('HTTP_FORWARDED');
        }
    } // end if
    if (empty($HTTP_VIA)) {
        if (!empty($_SERVER) && isset($_SERVER['HTTP_VIA'])) {
            $HTTP_VIA = $_SERVER['HTTP_VIA'];
        }
        else if (!empty($_ENV) && isset($_ENV['HTTP_VIA'])) {
            $HTTP_VIA = $_ENV['HTTP_VIA'];
        }
        else if (@getenv('HTTP_VIA')) {
            $HTTP_VIA = getenv('HTTP_VIA');
        }
    } // end if
    if (empty($HTTP_X_COMING_FROM)) {
        if (!empty($_SERVER) && isset($_SERVER['HTTP_X_COMING_FROM'])) {
            $HTTP_X_COMING_FROM = $_SERVER['HTTP_X_COMING_FROM'];
        }
        else if (!empty($_ENV) && isset($_ENV['HTTP_X_COMING_FROM'])) {
            $HTTP_X_COMING_FROM = $_ENV['HTTP_X_COMING_FROM'];
        }
        else if (@getenv('HTTP_X_COMING_FROM')) {
            $HTTP_X_COMING_FROM = getenv('HTTP_X_COMING_FROM');
        }
    } // end if
    if (empty($HTTP_COMING_FROM)) {
        if (!empty($_SERVER) && isset($_SERVER['HTTP_COMING_FROM'])) {
            $HTTP_COMING_FROM = $_SERVER['HTTP_COMING_FROM'];
        }
        else if (!empty($_ENV) && isset($_ENV['HTTP_COMING_FROM'])) {
            $HTTP_COMING_FROM = $_ENV['HTTP_COMING_FROM'];
        }
        else if (@getenv('HTTP_COMING_FROM')) {
            $HTTP_COMING_FROM = getenv('HTTP_COMING_FROM');
        }
    } // end if
 
    // Gets the default ip sent by the user
    if (!empty($REMOTE_ADDR)) {
        $direct_ip = $REMOTE_ADDR;
    }
 
    // Gets the proxy ip sent by the user
    $proxy_ip     = '';
    if (!empty($HTTP_X_FORWARDED_FOR)) {
        $proxy_ip = $HTTP_X_FORWARDED_FOR;
    } else if (!empty($HTTP_X_FORWARDED)) {
        $proxy_ip = $HTTP_X_FORWARDED;
    } else if (!empty($HTTP_FORWARDED_FOR)) {
        $proxy_ip = $HTTP_FORWARDED_FOR;
    } else if (!empty($HTTP_FORWARDED)) {
        $proxy_ip = $HTTP_FORWARDED;
    } else if (!empty($HTTP_VIA)) {
        $proxy_ip = $HTTP_VIA;
    } else if (!empty($HTTP_X_COMING_FROM)) {
        $proxy_ip = $HTTP_X_COMING_FROM;
    } else if (!empty($HTTP_COMING_FROM)) {
        $proxy_ip = $HTTP_COMING_FROM;
    } // end if... else if...
 
    // Returns the true IP if it has been found, else FALSE
    if (empty($proxy_ip)) {
        // True IP without proxy
        return $direct_ip;
    } else {
        $is_ip = preg_match('|^([0-9]{1,3}\.){3,3}[0-9]{1,3}|', $proxy_ip, $regs);
        if ($is_ip && (count($regs) > 0)) {
            // True IP behind a proxy
            return $regs[0];
        } else {
            // Can't define IP: there is a proxy but we don't have
            // information about the true IP
            return FALSE;
        }
    } // end if... else...
} // end of the 'PMA_getIp()' function

Всего записей: 1477 | Зарегистр. 09-09-2003 | Отправлено: 11:57 07-05-2004 | Исправлено: jvalej, 12:00 07-05-2004
Svarga

Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
в любом случае, при использовании high anonymity (elite) прокси-серверов реальный IP определить невозможно...

----------
away.

Всего записей: 4161 | Зарегистр. 25-06-2002 | Отправлено: 13:40 07-05-2004
Maclan



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Svarga

Цитата:
в любом случае, при использовании high anonymity (elite) прокси-серверов реальный IP определить невозможно...

 
Апплет может помочь в этом деле.

Всего записей: 924 | Зарегистр. 19-05-2003 | Отправлено: 17:09 07-05-2004
Svarga

Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maclan

Цитата:
Апплет может помочь в этом деле.  

вроде такого?
http://www.elant.ru/faq/java/files/167.html
 
может, но не везде его повесить можно... к тому же в последних виндах по умолчанию вообще никакой Java нет...

----------
away.

Всего записей: 4161 | Зарегистр. 25-06-2002 | Отправлено: 18:44 07-05-2004
Farkhad



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Резюме:
думаю лучший вариант это http://www.cgsa.net/php/identifierShow.php, объединяющий все остальные.
 
Всем спасибо за активное участие и посильную помощь!
 
Добавлено
off: подправили бы тут регэксп для ссылок, а то запятую захватывает..

Всего записей: 731 | Зарегистр. 03-08-2001 | Отправлено: 05:56 08-05-2004
Maclan



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Farkhad
Он же истинный IP не определяет.  
Если пользователь забанен, то он может через анонимный прокси зарегистироваться к примеру.
А нормальный апплет вытянит истинный IP.

Всего записей: 924 | Зарегистр. 19-05-2003 | Отправлено: 09:52 08-05-2004
Svarga

Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В общем, что в итоге насочинял (на perl, правда... но на php автозаменой секунд за 10 переводится ):

Цитата:
my $proxy = ($ENV{HTTP_X_FORWARDED_FOR}||$ENV{HTTP_VIA}||$ENV{HTTP_PROXY_CONNECTION}||
     $ENV{HTTP_CLIENT_IP} || $ENV{CLIENT_IP} || $ENV{HTTP_X_COMING_FROM} ||
     $ENV{HTTP_FORWARDED} || $ENV{HTTP_X_FORWARDED_FOR} || $ENV{HTTP_X_COMING_FROM} ||
     $ENV{HTTP_FROM} || $ENV{HTTP_SP_HOST} || $ENV{HTTP_X_LOCKING} ||
     $ENV{HTTP_CACHE_INFO} || $ENV{HTTP_PROXY_AUTHORIZATION} ||
     $ENV{HTTP_XROXY_CONNECTION} || $ENV{HTTP_X_LOOKING} || $ENV{HTTP_XONNECTION})
          ? 1 : 0;
 
my $ip=$ENV{HTTP_CLIENT_IP} || $ENV{CLIENT_IP} || $ENV{HTTP_X_COMING_FROM} ||
     $ENV{HTTP_COMING_FROM} || $ENV{HTTP_FORWARDED} || $ENV{HTTP_FORWARDED_FOR} ||
     $ENV{HTTP_X_FORWARDED} || $ENV{HTTP_X_FORWARDED_FOR} || $ENV{REMOTE_ADDR} || 'cmd';
 
my $proxy_ip = $ip ne $ENV{REMOTE_ADDR} ? $ENV{REMOTE_ADDR} :'';

что имеем: $ip - IP юзера или хорошо замаскированного прокси, $proxy (1/0) — юзается ли прокси, $proxy_ip — IP юзаемого прокси...
Попроверял, правда, на живых прокси — совсем хорошие ничего лишнего не отправляют, поэтому не часто такое поможет
 
Добавлено
А не сделать ли эту тему общей по определению IP посетителя (по всем языкам)?
 
Добавлено
Farkhad

Цитата:
off: подправили бы тут регэксп для ссылок, а то запятую захватывает..

можешь в багрепорте об этом написать или непосредственно Батве или ДимоНу (только они над местным кодом изнываются).

----------
away.

Всего записей: 4161 | Зарегистр. 25-06-2002 | Отправлено: 06:43 15-05-2004 | Исправлено: Svarga, 06:51 15-05-2004
Maclan



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Svarga

Цитата:
В общем, что в итоге насочинял  

Не будет это нормально работать однозначно....

Всего записей: 924 | Зарегистр. 19-05-2003 | Отправлено: 08:55 15-05-2004
Farkhad



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maclan
Мне не для таких уж и серьезных целей нужно
Но все равно спасибо
В апплетах я ни петь ни лаять

Всего записей: 731 | Зарегистр. 03-08-2001 | Отправлено: 20:50 15-05-2004
Maclan



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Farkhad
А если не для серьезных целей, то тогда зачем заморачиваться?
Смыла я не вижу.

Всего записей: 924 | Зарегистр. 19-05-2003 | Отправлено: 22:12 15-05-2004
Svarga

Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maclan

Цитата:
Не будет это нормально работать однозначно....

м-да...
А Java не будет работать вообще на всех MSIE в win server 2003 и большинстве XP )), потому как отсутсвует в установке системы по умолчанию. Аплеты аплетами, они от клиента зависят, а сервер есть сервер.
Короче, что лучше: не работающее вообще для половины (по крайней мере на моём сайте) посетителей определение IP, результаты которого к тому же должны после отработки на стороне клиента быть возвращены на сервер
или же универсальное серверное решение, допускающее неточности в определении, однако способное получать данные по всем посетителям, а не только тем, у кого есть поддержка java...
 
Странные вещи говоришь.

----------
away.

Всего записей: 4161 | Зарегистр. 25-06-2002 | Отправлено: 22:25 15-05-2004
Maclan



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Svarga
А тебе нужны пользователи, у кого не стоит Java?
Мне нет..
Если есть что на сайте, то они себе ее поставять поверь мне.

Всего записей: 924 | Зарегистр. 19-05-2003 | Отправлено: 22:36 15-05-2004
Svarga

Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maclan
Цитата:
А тебе нужны пользователи, у кого не стоит Java?  

мне нужны все посетители — хоть на 5-й Опере, хоть на lynx... к чему искусственные ограничения аудитории нужны?

Цитата:
Мне нет..  
Если есть что на сайте, то они себе ее поставять поверь мне.  

не поверю
большинству быстрее аналогичный сайт найти, чем качать 15 метров JRE...
 
Впрочем, всё это уже злостный офтоп...

----------
away.

Всего записей: 4161 | Зарегистр. 25-06-2002 | Отправлено: 00:06 16-05-2004 | Исправлено: Svarga, 00:07 16-05-2004
Farkhad



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maclan

Цитата:
А если не для серьезных целей, то тогда зачем заморачиваться?  
Смыла я не вижу.

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

Всего записей: 731 | Зарегистр. 03-08-2001 | Отправлено: 23:45 16-05-2004
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Интернет » Web-программирование » PHP: Качественное определение IP посетителя.


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru