Как определить 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 проверка адреса электронной почты, email

Ноябрь 10, 2015 г.

Серию валидаторов пополняю функцией проверки введенного email на соответствие формальным требованиям. По стандарту RFC822 Если есть необходимость соблюсти все требования, которые упомянуты в громоздкой спецификации RFC822, то лучший путь - воспользоваться ...

Читать

Определение версии браузера - PHP или javascript?

Май 17, 2011 г.

Хорошо если ваш сайт работает во всех, или почти во всех браузерах так, как вы того хотите. Все меняется, выходят новые версии, появляются новые возможности, и глупо их не использовать, в угоду "старичкам". Года 1,5 назад IE 6.0 (судя по статистике посещений ...

Читать

 

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