Intereting Posts
Получить смещенные соседи массива API Google: аутентифицировать запрос с помощью OAuth, но без окна согласия пользователя, затем запрашивать данные Google для определенного имени пользователя или идентификатора пользователя Добавьте атрибут nofollow для ссылки, если тег заголовка отсутствует с помощью PHP PHP: цикл через многомерный массив Параллельная загрузка файла AJAX LIMIT Доктрина всегда возвращает нулевые значения в производстве Php PDO: Почему добавление NULL дает 0 Загрузка файла HTML / PHP Лучше ли использовать mysql или файлы для хранения данных? Формат столбца DATETIME с использованием PHP после печати Symfony 2 Forms entity Тип поля Тип css динамическая ширина дочерних элементов в родительском контейнере Как пропустить итерации в цикле for в PHP? PHP не имеет функции для XML-безопасного сущностного декодирования? У вас нет xml_entity_decode? Медленный поиск местоположения

Как проверить, подключен ли кто-либо через IPv6 / IPv4

Я хочу проверить через php, если кто-то подключается к моему сайту через IPv4 или IPv6.

Адрес клиента можно найти в $_SERVER["REMOTE_ADDR"] но как проверить, является ли это IPv4 или IPv6?

Спасибо за ваше время

Andre

Проверить наличие IPv4

 $ip = "255.255.255.255"; if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { echo "Valid IPv4"; } else { echo "Invalid IPv4"; } 

Проверить наличие IPv6

 $ip = "FE80:0000:0000:0000:0202:B3FF:FE1E:8329"; if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { echo "Valid IPv6"; } else { echo "Invalid IPv6"; } 

Для получения дополнительной информации проверьте функцию PHP filter_vars и list of filters for validation .

Вы можете использовать это:

 function ipVersion($txt) { return strpos($txt, ":") === false ? 4 : 6; } 

Как насчет подсчета числа '.' и / или ' : ' в $_SERVER["REMOTE_ADDR"] ?

Если есть больше 0 ' : ' и no ' .$_SERVER["REMOTE_ADDR"] , я полагаю, вы можете считать, что пользователь подключен через IPv6.

Другим решением может быть использование расширения фильтра : есть константы (см. Конец страницы), которые, как представляется, связаны с IPv4 и IPv6:

FILTER_FLAG_IPV4 (целое число)
Разрешить только адрес IPv4 в фильтре «validate_ip».

FILTER_FLAG_IPV6 (целое число)
Разрешить только адрес IPv6 в фильтре «validate_ip».

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

Это возвращает true, если адрес, который выглядит как IPv6, передан, а false, если передан адрес, который выглядит как IPv4 (или IPv4-сопоставленный IPv6). Фактические адреса еще не проверены; используйте filter_var() если вам нужно их проверить.

 function is_ipv6($address) { $ipv4_mapped_ipv6 = strpos($address, "::ffff:"); return (strpos($address, ":") !== FALSE) && ($ipv4_mapped_ipv6 === FALSE || $ipv4_mapped_ipv6 != 0); } 

Вы можете использовать inet_pton :

 <?php $packedIp = inet_pton($ip); if ($packedIp === false) { // invalid IP } else if (isset($packedIp[4])) { // IPv6 } else { // IPv4 } 

Адреса IPv4 совпадают с regex /^\d{1,3}(\.\d{1,3}){3,3}$/ .

Вы можете использовать AF_INET6 для обнаружения ipv6 в PHP:

 <?php if ( defined('AF_INET6') ) { echo 'Yes'; } else { echo 'No'; } ?>