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

Январь 28, 2016 г.

Многие не задумываются при работе в PHP со стандартными функциями даты-времени о диапазоне их применимости (date(), time(), mktime() и т.п). Так мы можем скоро столкнуться с проблемой, подобная которой случалась уже раньше - "ошибка 2000". Я прекрасно ...

Читать

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

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

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

Читать

 

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