Main > MySQL | PHP > PHP: Как определить IP адрес пользователя?

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

22.07.2018 0 comments » Views: 2,593

IP адрес

Сегодня поговорим о том, как определить IP адрес пользователя в PHP, как его проверить с помощью регулярных выражений, как его конвертировать в число и обратно, как его хранить в базе данных MySQL, а так же о том, какие ip адреса заранее зарезервированы..

Вступление

IP адрес - это сокращение от Internet Protocol Address. Это числовой идентификатор компьютера или устройства в локальной сети или сети интернет. Бывают двух версий:

  • IPv4 (32 бита), пример: 192.168.0.1
  • IPv6 (128 бит), пример: 0000:0000:0000:0000:0000:0000:0000:1 или ::1

В этой статье мы поговорим про ip-адреса версии IPv4, т.е. об ip адресах из диапазона: 0.0.0.0 - 255.255.255.255

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

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

В результате выполнения скрипта, вы получите ip адрес посетителя.

Какой адрес будет показан при входе с моего ПК, на веб-сервер на моем ПК?

В случае, если Вы установили веб-сервер на свой ПК (например, Openserver) и открываете страницу опять же со своего ПК, вы увидите адрес 127.0.0.1. Это нормально, при переносе на нормальный хостинг, будет показан Ваш внешний IP.

Что будет при попытке получить ip-адрес выполнив скрипт из консоли?

Если Вы попробуете запустить такой скрипт из консоли, например создав файл ip.php с содержимым:

и затем в консоли выполните:

то вы получите ошибку, в которой будет написано, что PHP не может найти значение по указанному ключу

Дело в том, что эти переменные устанавливает веб-сервер и при запуске "напрямую" они не будут установлены

Как проверить откуда запускается скрипт из консоли или через веб-сервер?

Проверить откуда запускается скрипт можно с помощью функции php_sapi_name()

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

Если у Вас возникнет вопрос, почему просто не проверить через isset, отвечаю: переменная REMOTE_ADDR может быть установлена с помощью переменных окружения, тогда проверка isset пройдет, но значение может не соответствовать действительности. Да, можно проигнорировать проверку с помощью php_sapi_name(), но вы должны отдавать себе отчет в том, что вы делаете и почему именно так.

Как проверить IP адрес с помощью регулярного выражения?

Проверить IP адрес с помощью регулярного выражения можно простой проверкой:

Здесь проверяется, что в $ip содержится такая строка:

Более точной будет проверка ip-адреса вот таким выражением:

Здесь проверяется, что в $ip содержится такая строка:

Как определить IP адрес посетителя, находящегося за прокси сервером?

Достоверно на 100% определить нельзя. Можно попытать удачи с переменными HTTP_CLIENT_IP и HTTP_X_FORWARDED_FOR, но надо помнить что все переменные массива $_SERVER начинающиеся на HTTP_* это заголовки запроса, которые могут быть подделаны, переопределены, полностью отсутствовать, иметь не верный формат или содержать какую-нибудь гадость, например, sql-инъекцию.

Обычно используют так:

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

Как хранить IP адрес в базе данных MySQL?

Лично я предпочитаю хранить IP адрес в MySQL в поле типа VARCHAR(15), по длине самого длинного IPv4 адреса = 255.255.255.255

Другой способ, это привести IP адрес в к типу UNSIGNED INT. Это позволяет экономить память: 4 байта у UNSIGNED INT против 15 у CHAR.

Преобразовать IPv4 адрес к типу INT в PHP можно так

Тоже самое можно сделать и на стороне MySQL, для этого надо использовать функции INET_ATON() и INET_NTOA()

Запомнить эти функции достаточно просто:
ATON = Address TO Numaber
NTOA = Number TO Adress

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

Выбор, что использовать для хранения VARCHAR или INT стоит за проектировщиком БД и удобством использования в будущем.

Какие IP адреса являются предопределенными?

Для локальных сетей предопределены такие диапазоны IP адресов:

  • 10.0.0.0/8 или 10.0.0.0 - 10.255.255.255
  • 172.16.0.0/12 или 172.16.0.0 - 172.31.255.255
  • 192.168.0.0/16 или 192.168.0.0 - 192.168.255.255

Для коммуникаций внутри хоста (между программами запущенными на вашем ПК) используется диапазон ip-адресов: 127.0.0.0/8 или 127.0.0.0 - 127.255.255.255 .

Блок с 169.254.1.0 по 169.254.254.255 (подсеть 169.254.0.0/16 за исключением подсетей 169.254.0.0/24 и 169.254.255.0/24) —
используется для автоматической настройки сетевого интерфейса в случае отсутствия DHCP

 

Author: | Rating: 4/5 | Tags: , , , ,

Leave a Reply

Your email address will not be published. Required fields are marked *

Allowed HTML-tags: <a>, <code>, <i>, <em>, <strong>, <b>, <u>, <strike>