Как определить 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 адрес.

Написать комментарий

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

DOMDocument кодировка при сохранении в HTML

Декабрь 20, 2016 г.

PHP поддерживает работу с классом DOMDocument, но есть некоторые особенности, которые требуют внимания. Одна из них - это html кодирование символов, если вы не укажете в заголовке документа мета информацию о кодировке. Рассмотрим пример: [crayon-673ee51682f70048789509/] ...

Читать

PHP: функция преобразования к каноническому пути

Январь 26, 2021 г.

На замену realpath, который работает только с реально существующими файлами и папками UNIX, а также не работающий для ссылок, я написал функцию получения канонического пути. В документации встречается функция eio_realpath, которая требует подключения ...

Читать

 

Комментарии к «Как определить 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;
        }