Как узнать, какую версию интернет-протокола (IP) использует клиент при подключении к моему серверу? - PullRequest
34 голосов
/ 19 сентября 2009

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

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

Ответы [ 7 ]

38 голосов
/ 26 декабря 2014

Проверка 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.

25 голосов
/ 19 сентября 2009

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

function ipVersion($txt) {
     return strpos($txt, ":") === false ? 4 : 6;
}
6 голосов
/ 20 ноября 2016

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

<?php

$packedIp = @inet_pton($ip);

if ($packedIp === false) {
    // invalid IP
} else if (isset($packedIp[4])) {
    // IPv6
} else {
    // IPv4
}
6 голосов
/ 19 сентября 2009

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

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


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

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

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

4 голосов
/ 03 декабря 2012

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

Возвращает 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);
}
2 голосов
/ 19 декабря 2017

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

<?php
if ( defined('AF_INET6') ) {
    echo 'Yes';
} else {
    echo 'No';
}
?>
2 голосов
/ 19 сентября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...