Как определить ip адрес посетителя сайта в PHP

PHP не имеет каких то специальных средств для определения ip адреса. Эту информацию ему поставляет веб-сервер в виде переменных окружения.

Используя команду phpinfo(), можно получить список переменных окружения, настроек сервера, подключенных библиотек. Нас интересует удаленный адрес посетителя. В этой таблице он идет под именем «REMOTE_ADDR».

Вот пример, с моего локального тестового сервера:

remove-addr-ip-adress-client

Эта информация попадает в глобальную переменную-массив $_SERVER. Т.е. определить адрес пользователя очень просто —

В некоторых случаях переменные окружения могут быть подменены. К примеру, когда трафик проходит через прокси, обычно в качестве REMORE_ADDR выступает уже адрес прокси-сервера. Но программное обеспечение сохраняет адрес клиента в заголовке HTTP запроса. В переменные окружения этот адрес может попасть под разными именами.

Пример функции, извлекающей ip адрес, используя несколько переменных окружения.

В данном примере перебираются варианты названий переменной окружения. Сначала анализируется значение из $_SERVER[‘HTTP_CLIENT_IP’], потом проверяется в ‘HTTP_X_FORWARDED_FOR’ и в заключении в ‘REMOTE_ADDR’.

Доверять значению, передаваемому в переменных ‘HTTP…’ нельзя, так как эти значения передаются через заголовки HTTP запроса и могут содержать произвольную информацию. Их можно сохранить в качестве дополнения к значению ‘REMOTE_ADDR’.

Этот набор информации уже можно протоколировать, сохранять и использовать для анализа. Можно добавить проверку информации в переменных ‘HTTP..’ на соответствие формату, чтобы не сохранять то, что вам не нужно.

Пример функции валидатора строки, содержащей ip адрес.

Мало букафф? Читайте есчо !

Разбить строку на буквы в PHP

Январь 13, 2017 г.

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

Читать

Имя файла по handle в PHP

Июнь 15, 2016 г.

Всем привычна схема, при которой известно имя файла, и вы совершаете с ним какие то манипуляции. В PHP много функций, которые предоставляют именно такой функционал. Что делать, когда есть только file handle? Как получить имя открытого файла? ...

Читать

Читаем курсы валют, реализация для drupal

Декабрь 5, 2012 г.

Как я писал ранее, хороший информ-сервис, это не куча вариантов виджетов для вашего сайта, а, в наиболее ценном случае, возможность грузить данные информ-сервиса в виде xml. В развитом случае, это целый API для разработчика, с возможностью выборки данных ...

Читать

Как пользоваться flock()?

Март 24, 2017 г.

Если вы решаете задачу конкурентного доступа к файлу (или какому то другому ресурсу) в PHP, и решили использовать flock() для этой цели, то вам понадобится верно представлять как работает механизм блокировки. Представим себе, что есть разные программные ...

Читать
 

Комментарии к «Как определить ip адрес посетителя сайта в PHP»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий:

Много комментариев в “Как определить ip адрес посетителя сайта в PHP”

  1. Дмитрий:

    Здравствуйте!

    Скажите, пожалуйста, как вывести ip-адрес на сайте правильно.
    Вывожу так:

    Выводятся два одинаковых ip-адреса. Если вывести так:

    То выводится соответственно:

    Array
    (
    [addr] => 00.00.0.00
    [forwarded_addr] => 00.00.0.00
    )

    Спасибо!

    С уважением, Дмитрий

    • Дмитрий:

      Вывожу так:

      php foreach($ip as $ip_info):
      $ip_info
      php endforeach;

      В предыдущем сообщении вырезало, поэтому знаки лишние убрал сейчас.

      • Смысл статьи в том, что есть несколько переменных окружения, где может содержаться информация об ip пользователя. Вы можете принять какую то систему приоритетов, например, как это сделано в функции getClientIp(), а можете получить набор адресов, как в функции getClientIpInfo().

        Обычно, достаточно запросить $ip_address = $_SERVER[‘REMOTE_ADDR’], но если сайт находится за прокси сервером, то надо делать более сложные манипуляции.

        Пример получения ip_address из CMS Drupal:

        function ip_address() {
        static $ip_address = NULL;

        if (!isset($ip_address)) {
        $ip_address = $_SERVER[‘REMOTE_ADDR’];
        if (variable_get(‘reverse_proxy’, 0) && array_key_exists(‘HTTP_X_FORWARDED_FOR’, $_SERVER)) {
        // If an array of known reverse proxy IPs is provided, then trust
        // the XFF header if request really comes from one of them.
        $reverse_proxy_addresses = variable_get(‘reverse_proxy_addresses’, array());
        if (!empty($reverse_proxy_addresses) && in_array($ip_address, $reverse_proxy_addresses, TRUE)) {
        // If there are several arguments, we need to check the most
        // recently added one, i.e. the last one.
        $ip_address_parts = explode(‘,’, $_SERVER[‘HTTP_X_FORWARDED_FOR’]);
        $ip_address = array_pop($ip_address_parts);
        }
        }
        }

        return $ip_address;
        }