Я хочу проверить через php, если кто-то подключается к моему сайту через IPv4 или IPv6.
Адрес клиента можно найти в $_SERVER["REMOTE_ADDR"]
, но, как проверить, является ли он IPv4 или IPv6?
Спасибо за ваше время
Андре
Я хочу проверить через 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"]
?
Если в $_SERVER["REMOTE_ADDR"]
есть больше 0 ':
' и символ <<24 > , я полагаю, вы можете считать, что пользователь подключен через IPv6.
Другим решением может быть использование расширения : есть constants (см. конец страницы), которые, как представляется, связаны с 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
для обнаружения ipv6 в PHP:
<?php
if ( defined('AF_INET6') ) {
echo 'Yes';
} else {
echo 'No';
}
?>