Как использовать функцию проверки IP-адреса посетителя в PHP? - PullRequest
4 голосов
/ 24 марта 2010

Я все еще запутался в этом вопросе и прошу любую помощь и справку о том, как проверить IP-адрес посетителя через PHP.

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

Кстати, что следует учитывать, когда нам нужно кодировать какую-то функцию, подобную этой?

PS: Большое спасибо всем. Это были поучительные аргументы. Честно говоря, я выбираю ответ больше как уважение, а не правду в нем. Потому что до сих пор я все еще не знаю правильный. Может быть, мне нужно больше лет обучения, прежде чем я получу четкое понимание самой темы.

Ответы [ 8 ]

6 голосов
/ 24 марта 2010

См. $ _ SERVER , в частности:

$_SERVER['REMOTE_ADDR'];
5 голосов
/ 24 марта 2010

Хорошо, просто, Джо, я вижу, вы запутались в этом аргументе, и в этом есть моя большая роль.

Еще несколько объяснений для вас.

Ответ зависит от задачи. У вас есть 2 варианта:

Если вам нужен только один IP-адрес, вы можете использовать только REMOTE_ADDR и больше ничего. Посмотрите на журнал доступа веб-сервера: есть только один IP-адрес, и он REMOTE_ADDR. По крайней мере, он гарантировал вам действительный IP-адрес. Во многих случаях, как счетчик трафика, это единственное, на что вы можете положиться. Это общий ответ на вопрос «Как получить IP-адрес».

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

Единственный случай для заголовка FORWARDED_FOR - неправильно настроенный веб-сервер, который помещает реальный IP-адрес в эту переменную. В этом случае его можно использовать как IP-адрес. Но, конечно, это должно быть сделано вручную, в каждом конкретном случае, а не в качестве общей рекомендации. Но в любом случае я бы вышел из такого веб-сервера, поскольку в нем не может быть только одной неверной конфигурации.

4 голосов
/ 24 марта 2010

Чтобы получить IP-адрес пользователя, вы должны использовать это,

$ip = $_SERVER['REMOTE_ADDR']
2 голосов
/ 24 марта 2010

Общий широкий ответ: все, что PHP знает о клиенте, хранится в переменной $ _SERVER.Итак, делайте этот код каждый раз, когда вам нужна конкретная информация, чтобы увидеть, можете ли вы найти что-то подходящее:

<code>echo "<pre>";
print_r($_SERVER);
echo "
"; // или просто phpinfo (32);

$ _ SERVER ['REMOTE_ADDR'] - это единственный IP-адрес , который вы можете получить, хотя это может быть и не "адрес клиента".

2 голосов
/ 24 марта 2010

Если ваш клиент работает через прокси-сервер, то $_SERVER['REMOTE_ADDR'] просто возвращает IP-адрес прокси-сервера, а не компьютера клиента. Это не очень надежно. Это может быть лучшим решением:

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)) {
   foreach (explode(',', $_SERVER[$key]) as $ip) {
    $ip = trim($ip); // just to be safe
    if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false) {
     self::$ip = $ip;
     return $ip;
    }
   }
  }
 }
}

Это уже обсуждалось в отношении переполнения стека. Пожалуйста, обратитесь к «Как наиболее точно получить правильный IP-адрес пользователя в PHP?» . Приведенный выше код является оптимизированной версией принятого ответа на этот вопрос.

Однако учтите, что получение IP-адресов никогда не бывает полностью надежным: php / ajax REMOTE_ADDR установлен на IP поддельного сетевого адаптера

1 голос
/ 24 марта 2010

Следующее служило бы цели.

$ip = $_SERVER['REMOTE_ADDR'];

echo "IP address is : " :.$ip;
0 голосов
/ 24 марта 2010

Просто используйте это в верхней части вашего кода:

if (function_exists('apache_request_headers'))
{
    $headers = apache_request_headers();

    if (array_key_exists('X-Forwarded-For', $headers))
    {
        $ips = explode(',',$headers['X-Forwarded-For'],2);
        $_SERVER["REMOTE_ADDR"]= trim($ips[0]);
    }
}

Он будет гарантировать, что $_SERVER["REMOTE_ADDR"] всегда будет сохранять правильный IP-адрес в приложениях балансировки нагрузки или нет.

0 голосов
/ 24 марта 2010

Я предлагаю вам использовать сторонний IP-адрес для геоконвертера для расчета местоположения. Так как вам не придется обнажать пространство базы данных. Точность и запросы.

Все, что вам нужно сделать, это что-то вроде

http://third-party-url.com?ip=IP_ADDRESS

и возвращает XML или массив данных.

Вы можете использовать это, чтобы сделать что-нибудь позже.

Вот два популярных сайта. * Поиск моего IP-адреса и геотаргетинг * SimpleGeo

Есть много таких сайтов .. Может быть, другие могут добавить их сюда.

...