Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как правильно определить ip пользователя?
 
 автор: tester   (31.07.2008 в 14:17)   письмо автору
 
 

я использую такой код

if (!empty($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_CLIENT_IP']) && (preg_match('~^((0|10|172\.16|192\.168|255|127\.0)\.|unknown)~', $_SERVER['HTTP_CLIENT_IP']) == 0 || preg_match('~^((0|10|172\.16|192\.168|255|127\.0)\.|unknown)~', $_SERVER['REMOTE_ADDR']) != 0)){
    if (strtok($_SERVER['HTTP_X_FORWARDED_FOR'], '.') != strtok($_SERVER['HTTP_CLIENT_IP'], '.') && '.' . strtok($_SERVER['HTTP_X_FORWARDED_FOR'], '.') == strrchr($_SERVER['HTTP_CLIENT_IP'], '.') && (preg_match('~^((0|10|172\.16|192\.168|255|127\.0)\.|unknown)~', $_SERVER['HTTP_X_FORWARDED_FOR']) == 0 || preg_match('~^((0|10|172\.16|192\.168|255|127\.0)\.|unknown)~', $_SERVER['REMOTE_ADDR']) != 0)) {
        $_SERVER['REMOTE_ADDR'] = implode('.', array_reverse(explode('.', $_SERVER['HTTP_CLIENT_IP'])));
    } else {
        $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_CLIENT_IP'];
    }    
}
if (!empty($_SERVER['HTTP_CLIENT_IP']) && (preg_match('~^((0|10|172\.16|192\.168|255|127\.0)\.|unknown)~', $_SERVER['HTTP_CLIENT_IP']) == 0 || preg_match('~^((0|10|172\.16|192\.168|255|127\.0)\.|unknown)~', $_SERVER['REMOTE_ADDR']) != 0)){
    if (strtok($_SERVER['REMOTE_ADDR'], '.') != strtok($_SERVER['HTTP_CLIENT_IP'], '.')){
        $_SERVER['REMOTE_ADDR'] = implode('.', array_reverse(explode('.', $_SERVER['HTTP_CLIENT_IP'])));
    } else {
        $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_CLIENT_IP'];
    }    
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
    if (strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',') !== false){
        $ips = array_reverse(explode(', ', $_SERVER['HTTP_X_FORWARDED_FOR']));
        foreach ($ips as $i => $ip){
            if (preg_match('~^((0|10|172\.16|192\.168|255|127\.0)\.|unknown)~', $ip) != 0 && preg_match('~^((0|10|172\.16|192\.168|255|127\.0)\.|unknown)~', $_SERVER['REMOTE_ADDR']) == 0) continue;
            $_SERVER['REMOTE_ADDR'] = trim($ip);
            break;
        }
    } elseif (preg_match('~^((0|10|172\.16|192\.168|255|127\.0)\.|unknown)~', $_SERVER['HTTP_X_FORWARDED_FOR']) == 0 || preg_match('~^((0|10|172\.16|192\.168|255|127\.0)\.|unknown)~', $_SERVER['REMOTE_ADDR']) != 0) $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
} elseif (!isset($_SERVER['REMOTE_ADDR'])) $_SERVER['REMOTE_ADDR'] = $_SERVER['GEOIP_ADDR'];


проблема состоит в том, что по статистике li.ru ip отличаються на 20%

  Ответить  
 
 автор: levsha   (31.07.2008 в 19:16)   письмо автору
 
   для: tester   (31.07.2008 в 14:17)
 

Проверяйте переменную REMOTE_ADDR - адрес клиента, HTTP_X_FORWARDED_FOR - если эта переменная установлена, клиент использует "прозрачный прокси", тогда
REMOTE_ADDR - адрес прокси, а HTTP_X_FORWARDED_FOR - истинный адрес клиента

  Ответить  
 
 автор: а-я   (31.07.2008 в 20:34)   письмо автору
 
   для: levsha   (31.07.2008 в 19:16)
 

Лучше это все не менять местами...
Хранить 2 IP.
1) Откуда пришел запрос REMOTE_ADDR
2) ВОЗМОЖНО истинный адрес, HTTP_X_FORWARDED_FOR , если он есть.
т.к. 2IP можно очень легко изменить. Лучше не верить им. просто показывать.

  Ответить  
 
 автор: Phantom   (03.08.2008 в 02:30)   письмо автору
 
   для: tester   (31.07.2008 в 14:17)
 

HTTP_X_FORWARDED_FOR и HTTP_CLIENT_IP указаны в http заголовках. Чаще всего их наличие указывает на то, что пользователь использует прокси. Но если вам нужно ограничить доступ или что-то подобное, то на них полагаться не стоит, так как их легко подделать просто добавив строку в http заголовок.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования