Php узнать реальный ip

Как получить IP-адрес посетителя сайта в PHP?

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

За свою скромную карьеру программиста я сталкивался с этим вопросом много раз, видел разные реализации описанного и на личном опыте, открыл для себя некоторые моменты, о которых сегодня расскажу в этом посте.

Итак, простое получение IP-адреса пользователя в PHP осуществляется через суперглобальный массив $_SERVER с ключом REMOTE_ADDR:

Вполне рабочий вариант, но в случае, когда человек использует прокси, REMOTE_ADDR вернет нам не его (человека) реальный IP-адрес, а конечный этого прокси-сервера, через который он попал на сайт. Чтобы учесть это, воспользуйтесь следующей функцией:

 function getUserIP() { if(!empty($_SERVER['HTTP_CLIENT_IP'])) { $userIP = $_SERVER['HTTP_CLIENT_IP']; > elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $userIP = $_SERVER['HTTP_X_FORWARDED_FOR']; > else { $userIP = $_SERVER['REMOTE_ADDR']; > return $userIP; >

Это (в общем) итоговый вариант, а теперь к нюансам.

1. Иногда нам может вернуться не один IP-адрес, а список из нескольких. Можете оставить как есть, это просто уточнение для вас, а можете получить один, например, последний:

 $userIP = explode(',', $_SERVER['REMOTE_ADDR']); // Разбиваем список IP-адресов на массив echo trim(end($userIP)); // Выводим последний элемент (IP-адрес) и удаляем у него пробелы по бокам

В случае с функцией выше эту конструкцию можно написать вместо строчки с return:

 $userIP = explode(',', $userIP); return trim(end($userIP));

2. По-хорошему, особенно если вы работаете с базой данных, полученный результат лучше фильтровать (об этом ниже).

3. Если ваш сайт подключен к Cloudflare, то стоит проверять IP, который он возвращает:

 if(isset($_SERVER['HTTP_CF_CONNECTING_IP'])) { // Если сайт подключен к Cloudflare echo $_SERVER['HTTP_CF_CONNECTING_IP']; > else { echo $_SERVER['REMOTE_ADDR']; >

Выше представленная функция тогда будет иметь следующий вид:

 function getUserIP() { if(!empty($_SERVER['HTTP_CLIENT_IP'])) { $userIP = $_SERVER['HTTP_CLIENT_IP']; > elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $userIP = $_SERVER['HTTP_X_FORWARDED_FOR']; > elseif(isset($_SERVER['HTTP_CF_CONNECTING_IP'])) { // Если сайт подключен к Cloudflare $userIP = $_SERVER['HTTP_CF_CONNECTING_IP']; > else { $userIP = $_SERVER['REMOTE_ADDR']; > return $userIP; >

Когда я писал свой модуль статистики, именно этот момент «всплыл» у некоторых пользователей, которые начали его использовать.

Читайте также:  Java jlist добавить элемент

Фильтрация (валидация) IP-адресов в PHP

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

В PHP на такой случай (фильтрация IP) существует функция filter_var.

Сама по себе функция умеет фильтровать не только IP-адреса. С ней мы уже сталкивались с вами при написании формы обратной связи (там мы с помощью неё фильтровали e-mail).

Простой пример использования:

 $userIP = filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP); if($userIP) { echo $userIP; > else { echo 'IP-адрес невалиден'; >

В ранее написанной нами функции её можно использовать вместо строчки с return:

 $userIP = filter_var($userIP, FILTER_VALIDATE_IP); if($userIP) { return $userIP; > else { return 'IP-адрес невалиден'; >

Это общий вариант использования функции, который проверяет корректность IP-адреса (v4 или v6). Дополнительно можно использовать флаги:

  1. FILTER_FLAG_IPV4 – IP-адрес формата IPv4;
  2. FILTER_FLAG_IPV6 – IP-адрес формата IPv6;
  3. FILTER_FLAG_NO_PRIV_RANGE – IP-адрес не входит в диапазон частных адресов;
  4. FILTER_FLAG_NO_RES_RANGE – IP-адрес не входит в диапазон зарезервированных адресов.
 $userIP = filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); if($userIP) { echo $userIP; > else { echo 'IP-адрес невалиден'; >

Флаги можно совмещать с помощью побитового оператора | (операция ИЛИ):

 $userIP = filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE); if($userIP) { echo $userIP; > else { echo 'IP-адрес невалиден'; >

Таким образом, мы проверяем, что IP-адрес имеет формат IPv4 и он не входит в диапазон частных адресов.

А вот FILTER_FLAG_IPV4 и FILTER_FLAG_IPV6 между собой совмещать не стоит, поскольку функция это проверяет по умолчанию.

Источник

Как получить IP через PHP для сервера и пользователя

php-uznat-ip-adres

Доброго времени суток 🙂

На практике часто возникает необходимость узнать IP в PHP скрипте сайта. Причём, это может быть как IP адрес сервера, так и посетителя, производящего действия на вашем ресурсе.

Причём, последний иногда может пользоваться сайтом не напрямую, а по каким-то причинам подключаясь к нему через прокси сервер. Этот случай усложняет жизнь тем, что для подключения используется изменённый IP адрес.

Но, к счастью, в PHP получить IP адрес как клиента, так и самого сайта в этом случае более, чем реально. Причём, для этого не потребуются никакие специальные библиотеки и средства движков сайтов. Всё необходимое уже есть в самом PHP «на борту».

Читайте также:  Задать строку в питоне

Нам осталось только пользоваться 🙂

Как в PHP узнать IP сервера

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

В этой ситуации отыскать нужное становится непростой задачей, для решения которой нужно знать назначение переменных массива.

В частности, для того, чтобы в PHP определить IP адрес сервера, в коде нужно прописать следующую конструкцию:

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

Как в PHP получить IP посетителя

Для определения в PHP IP пользователя, с которого он подключается к вашему сайту, мы воспользуемся тем же массивом $_SERVER. В данном случае нас будет интересовать переменная REMOTE_ADDR, содержимое которой можно вывести на экран привычным способом:

Однако, в случаях использования клиентом прокси соединений, т.е. когда при подключении трафик идёт через сторонний прокси сервер, данная переменная будет содержать IP адрес не посетителя, а прокси сервера.

Чтобы узнать в PHP IP адрес посетителя в данном случае, нужно воспользоваться другим способом.

http://cccp-blog.com/wp-includes/images/banners/templatemonster/banner_content_mobile.png

Как в PHP определить IP пользователя, использующего прокси

Первым делом, в PHP IP посетителя при использовании прокси можно попробовать получить следующим способом:

Данный код можно найти практически во всех PHP скриптах, определяющих реальный IP посетителя. Однако, мало кто может объяснить, что хранится в данной переменной.

Если прописать данный код у себя в сайте на локальном сервере, то вы вообще получите пустое значение, т.е. данной переменной в массиве $_SERVER у вас не окажется. И это не удивительно, т.к. в HTTP_CLIENT_IP хранится глобальный IP пользователя, т.е. его адрес в сети Интернет.

И, самое главное, что на это значение не влияет прокси соединение, т.е. здесь вы найдёте реальный IP пользователя, а не его прокси сервера.

Если по каким-то причинам данная переменная будет отсутствовать в PHP $_SERVER, то можете попробовать узнать IP адрес клиента ещё и таким способом:

В данную переменную прокси сервера сами помещают реальный IP посетителя.

Читайте также:  Image Padding

Таким образом, для того, чтобы в PHP узнать IP клиента гарантированно, можно использовать следующую конструкцию:

Данный скрипт выведет на экран значение переменной $ip, в которую при использовании прокси соединения будет записан глобальный IP посетителя. Если же его не будет найдено в PHP $_SERVER, то скрипт попытается узнать IP пользователя, записанный самим прокси сервером.

Если же ни одной переменной не будет присвоено значение, то с большой вероятностью можно предположить, что посетитель не использует прокси либо прокси сервер не предоставляет реальный IP посетителя. В этом случае, чтобы получить хоть какое-то значение IP, мы берём его из REMOTE_ADDR. Но, с высокой долей вероятности, это значение будет IP адресом прокси сервера (благо, что ими не пользуется абсолютно каждый клиент сайтов).

Для проверки существования значений переменных я, как видите, решил воспользоваться PHP функцией filter_var, которая фильтрует переменные с применением определённого фильтра (шаблона), которым в данном случае является FILTER_VALIDATE_IP.

В завершение хочу подытожить, что описанным выше способом, несмотря на все тщательные проверки всех возможных серверных переменных PHP, определить IP пользователя с использованием прокси всё равно не получится на 100%.

Дело в том, что IP адрес клиента предоставляют только определённый тип прокси серверов, которые называют «прозрачными». Как правило, это открытые службы.

Библиотека курсов

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

Оставляйте свои отзывы в комментариях — что понравилось, что нет, может быть, о чём-то следовало бы рассказать поподробнее… Мне интересно любое ваше мнение.

P.S.: если вам нужен сайт либо необходимо внести правки на существующий, но для этого нет времени и желания, могу предложить свои услуги.

Более 5 лет опыта профессиональной разработки сайтов. Работа с PHP, OpenCart, WordPress, Laravel, Yii, MySQL, PostgreSQL, JavaScript, React, Angular и другими технологиями web-разработки.

Опыт разработки проектов различного уровня: лендинги, корпоративные сайты, Интернет-магазины, CRM, порталы. В том числе поддержка и разработка HighLoad проектов. Присылайте ваши заявки на email cccpblogcom@gmail.com.

И с друзьями не забудьте поделиться 😉

Источник

Оцените статью