Я хочу проверить через php, если кто-то подключается к моему сайту через IPv4 или IPv6.
Адрес клиента можно найти в $_SERVER["REMOTE_ADDR"]
но как проверить, если это IPv4 или IPv6?
Проверьте для 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 ‘:
‘, и нет ‘.
символ в $_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 соответствуют регулярному выражению /^\d{1,3}(\.\d{1,3}){3,3}$/
,
Ты можешь использовать AF_INET6
определить, скомпилирован ли PHP с поддержкой IPv6:
<?php
if ( defined('AF_INET6') ) {
echo 'Yes';
} else {
echo 'No';
}
?>