2009-04-16

Как узнать IP посетителя сайта

Казалось бы, нет ничего проще - ip адрес посетителя заносится Апачем в переменную $_SERVER['REMOTE_ADDR'] но есть некоторые нюансы...

Пользователь может находится за прокси-сервером а это значит что в REMOTE_ADDR будет адрес не пользователя а прокси-сервера. Если пользователь использует анонимный прокси-сервер с целью спрятать свой ip адрес то определить его реальный адрес вряд ли получится, но если пользователь использует не анонимный прокси, например экономит трафик или еще зачем, то его вполне можно вычислить по заголовкам HTTP_X_FORWARDED_FOR, но при этом нужно учитывать, что если он выходит через прокси своей организации то там может содержаться внутренний ip адрес который нам не нужен.

Все вышесказанное учитывается в вот какой несложной функции:

function get_ip(){
    $alt_ip = $_SERVER['REMOTE_ADDR'];
    if (isset($_SERVER['HTTP_CLIENT_IP'])){
        $alt_ip = $_SERVER['HTTP_CLIENT_IP'];
    }
    else if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)){
        // make sure we dont pick up an internal IP defined by RFC1918
        foreach ($matches[0] AS $ip){
            if (!preg_match("#^(10|172\.16|192\.168)\.#", $ip)){
                $alt_ip = $ip;
                break;
            }
        }
    }
    else if (isset($_SERVER['HTTP_FROM'])){
        $alt_ip = $_SERVER['HTTP_FROM'];
    }
    return $alt_ip;
}

 

 

комментарии:

 
nikl (анонимный пользователь) | 2011-03-20
if (!preg_match("#^(10|172\.16|192\.168)\.#", $ip)) дурь, ибо 172.16 имеет маску /12, т.е. продлевается вплоть до 172.31
gricenko_danila@mail.ru (анонимный пользователь) | 2011-11-16

 

как у вас все сложно
вот так тоже IP поситителя можно узнать:
 
<?
echo $_SERVER['REMOTE_ADDR'];
?>
max | 2011-11-16

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

Для того чтобы каждый раз не представляться можно войти как зарегистрированный пользователь.

Имя*

разрешены только теги br, font, span, p, strong, u, p, blockquote, a, div, img - остальные будут безжалостно удаляться