Получение реального IP-адреса пользователя с использованием PHP - PullRequest
2 голосов
/ 14 января 2011

Я хочу получить реальный IP-адрес от пользователей, заходящих на мой сайт, даже если они используют прокси-сайт, такой как hidemyass.com

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

<?php
function getRealIpAddr()
{
    if (!empty($_SERVER['HTTP_CLIENT_IP']))   //check ip from share internet
    {
      $ip=$_SERVER['HTTP_CLIENT_IP'];
    }
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))   //to check ip is pass from proxy
    {
      $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
      $ip=$_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}
?>

Я думал, что этот код будет работать, но прокси по-прежнему обходят его.

Заранее спасибо.

Ответы [ 6 ]

19 голосов
/ 14 января 2011

Не существует гарантированного способа получения «настоящего» IP-адреса, если прокси-сервер не хочет сообщать вам об этом (и любой истинный анонимный прокси не будет ).

6 голосов
/ 14 января 2011

Вы не можете. У вас есть информация от apache / iis / what, и он знает только, кто общается с вашим сервером, который в данном случае является прокси. Если прокси-сервер не захочет отправить эту информацию в заголовке, вы ее не получите.

X-Forwarded-For - лучшее, что вы можете сделать, но вряд ли анонимный прокси отправит это.

5 голосов
/ 14 января 2011

Вы не можете получить «реальный» IP-адрес наверняка, если не внедрите какой-либо протокол аутентификации на прикладном уровне, который кодирует IP-адрес (который также подвержен спуфин).

Почему это так?

Поскольку пакет данных IP может быть произвольно переписан кем-то «посередине», который имеет к нему доступ.Например, прокси, маршрутизатор, шлюз и т. Д.

Пакет данных IP имеет такую ​​структуру

| stuff | src ip | dst ip  | stuff |
| ....  | 32-bits| 32 bits | stuff |

Так что src ip - это всего лишь биты, помните - можно произвольно перезаписать.

http://www.faqs.org/rfcs/rfc791.html даст больше информации.

2 голосов
/ 14 января 2011

Если прокси-сервер не помещает реальный IP-адрес в заголовки (обычно - в зависимости от того, почему прокси используется) (обычно в некоторой форме «X-что-то»), то вы можете видеть только IP-адрес прокси .

0 голосов
/ 05 сентября 2014

Попробуйте, пожалуйста

function get_IP_address()
{
  foreach (array('HTTP_CLIENT_IP',
               'HTTP_X_FORWARDED_FOR',
               'HTTP_X_FORWARDED',
               'HTTP_X_CLUSTER_CLIENT_IP',
               'HTTP_FORWARDED_FOR',
               'HTTP_FORWARDED',
               'REMOTE_ADDR') as $key){
    if (array_key_exists($key, $_SERVER) === true){
        foreach (explode(',', $_SERVER[$key]) as $IPaddress){
            $IPaddress = trim($IPaddress); // Just to be safe

            if (filter_var($IPaddress,
                           FILTER_VALIDATE_IP,
                           FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)
                !== false) {

                return $IPaddress;
            }
        }
    }
}
}
0 голосов
/ 14 января 2011

Я нашел похожую запись здесь, чтобы проверить, есть ли еще заголовки, чтобы узнать, использует ли пользователь прокси, что может помочь

определить, использует ли пользователь прокси

...