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

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

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

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

Андре

Ответ 1

Проверить наличие 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.

Ответ 2

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

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

Ответ 3

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

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


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

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

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

Ответ 4

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

Это возвращает 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);
}

Ответ 5

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

<?php

$packedIp = inet_pton($ip);

if ($packedIp === false) {
    // invalid IP
} else if (isset($packedIp[4])) {
    // IPv6
} else {
    // IPv4
}

Ответ 6

Все адреса IPv4 соответствуют регулярному выражению /^\d{1,3}(\.\d{1,3}){3,3}$/.

Ответ 7

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

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