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

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

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

34

Решение

Проверьте для 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.

37

Другие решения

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

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

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

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

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

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

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

6

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

Возвращается значение 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);
}
4

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

<?php

$packedIp = @inet_pton($ip);

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

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

2

Ты можешь использовать AF_INET6 определить, скомпилирован ли PHP с поддержкой IPv6:

<?php
if ( defined('AF_INET6') ) {
echo 'Yes';
} else {
echo 'No';
}
?>
2
По вопросам рекламы [email protected]