Я хочу проверить через 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'; } ?>