2009-09-19 9 views

Respuesta

6

¿Qué hay de contar el número de '.' y/o ':' en $_SERVER["REMOTE_ADDR"]?

Si hay más de 0 ':', y ningún símbolo '.' en $_SERVER["REMOTE_ADDR"], supongo que puede considerar que el usuario está conectado a través de IPv6.


Otra solución podría ser utilizar la filter extension: hay constants(véase el final de la página) que parecen estar relacionados con IPv4 e IPv6:

FILTER_FLAG_IPV4 (número entero)
Permitir solo dirección IPv4 en el filtro "validate_ip" .

FILTER_FLAG_IPV6 (número entero)
Permitir dirección solamente IPv6 en "validate_ip" filtro.

+5

No asuma que si hay ''. es un IPv4, IPv6 también puede contener direcciones de estilo IPv4, por ejemplo: 0: 0: 0: 0: 0: 127.0.0.1 – Christian

2

Direcciones IPv4 todas coinciden con la expresión regular /^\d{1,3}(\.\d{1,3}){3,3}$/.

+1

parece que hace el trabajo. pero hey ....es una expresión regular! puede hacer de todo, si usted sabe cómo ... –

22

Puede utilizar esta:

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

Me gusta esto mejor que regexp - es más rápido :) – bisko

+0

sí ... parece ser más rápido –

+3

En un servidor de doble pila (que es el despliegue habitual) esto _siempre_ devolverá '6' debido a [direcciones IPv6 asignadas por IPv4] (https://en.wikipedia.org/wiki/IPv6#IPv4-mapped_IPv6_addresses). Para arreglar esto, también verifique que la cadena no comience con ':: ffff:' (y probablemente quiera quitar eso también). –

4

Desde el más votado respuesta tiene un problema bastante importante, voy a compartir mi propia.

Esto se devuelve verdadero si se pasa una dirección que parece ser IPv6, y falso si se pasa una dirección que parece ser IPv4 (o IPv6 mapeado con IPv4). Las direcciones reales no se validan; use filter_var() si necesita validarlos.

function is_ipv6($address) { 
    $ipv4_mapped_ipv6 = strpos($address, "::ffff:"); 
    return (strpos($address, ":") !== FALSE) && 
      ($ipv4_mapped_ipv6 === FALSE || $ipv4_mapped_ipv6 != 0); 
} 
+0

gracias brah, funciona – Skyzer

+0

dirección mapeada ipv4 aún no es válida dirección ipv4, ¿por qué lo considerarías como ipv4? –

+0

@CemKalyoncu porque desde el punto de vista de una red, cuando tienes un IPv4 asignado, no hay IPv6 en uso, por lo que si necesitas hacer una búsqueda DNS inversa o algo similar, tendrá que ser un IPv4. – Ale

26

Comprobar para IPv4

$ip = "255.255.255.255"; 
if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {  
    echo "Valid IPv4"; 
} 
else { 
    echo "Invalid IPv4"; 
} 

Comprobar para 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"; 
} 

Para más información, comprobar la función de PHP filter_vars y list of filters for validation.

+2

Finalmente, una solución ** nativa ** – mate64

3

Puede utilizar inet_pton:

<?php 

$packedIp = inet_pton($ip); 

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

Usted puede utilizar para detectar AF_INET6 IPv6 en PHP:

<?php 
if (defined('AF_INET6')) { 
    echo 'Yes'; 
} else { 
    echo 'No'; 
} 
?> 
Cuestiones relacionadas