2012-09-15 27 views
5

Tengo un problema con $ _SERVER ['REMOTE_ADDR'] en PHP Da un valor similar a IPv6 aunque el servidor use IPv4.

¿Alguien me puede ayudar a resolver este problema.

+0

¿Estas seguro que su servidor se está ejecutando en IPv4? –

+2

Esto se debe a que su servidor web es vinculante para [::], no para 0.0.0.0. –

Respuesta

15

El servidor está aceptando conexiones en un socket IPv6. Algunos sistemas operativos pueden hacer tanto IPv4 como IPv6 en un socket IPv6. Cuando eso suceda, la dirección IPv6 se verá como ::ffff:192.0.2.123 o ::ffff:c000:027b, que es la misma dirección pero está escrita en hexadecimal.

Si ves las direcciones IPv6 como 2a00:8640:1::224:36ff:feef:1d89 entonces su servidor web realmente es accesible a través de IPv6 :-)

De todos modos, para convertir todo de nuevo a una forma canónica se puede usar algo como:

// Known prefix 
$v4mapped_prefix_hex = '00000000000000000000ffff'; 
$v4mapped_prefix_bin = pack("H*", $v4mapped_prefix_hex); 

// Or more readable when using PHP >= 5.4 
# $v4mapped_prefix_bin = hex2bin($v4mapped_prefix_hex); 

// Parse 
$addr = $_SERVER['REMOTE_ADDR']; 
$addr_bin = inet_pton($addr); 
if($addr_bin === FALSE) { 
    // Unparsable? How did they connect?!? 
    die('Invalid IP address'); 
} 

// Check prefix 
if(substr($addr_bin, 0, strlen($v4mapped_prefix_bin)) == $v4mapped_prefix_bin) { 
    // Strip prefix 
    $addr_bin = substr($addr_bin, strlen($v4mapped_prefix_bin)); 
} 

// Convert back to printable address in canonical form 
$addr = inet_ntop($addr_bin); 

Usando este código, cuando la entrada de uno de los siguientes:

::ffff:192.000.002.123 
::ffff:192.0.2.123 
0000:0000:0000:0000:0000:ffff:c000:027b 
::ffff:c000:027b 
::ffff:c000:27b 
192.000.002.123 
192.0.2.123 

se trata siempre del Canonica l Dirección IPv4 192.0.2.123 como salida.

Y, por supuesto, las direcciones IPv6 conseguir regresaron como direcciones IPv6 canónicas: 2a00:8640:0001:0000:0224:36ff:feef:1d89 convierte 2a00:8640:1::224:36ff:feef:1d89 etc.

+0

Gracias. Haré algo para filtrar la IP. – Brijesh

+0

Intenté agregar todos los ejemplos a mi script de prueba, y nunca ejecuto el trazado del prefijo. ¿Hay demasiados 0 en su código de muestra para todos sus ejemplos? –

+0

No, todos los ejemplos son válidos. ¿Puedes mostrar tu script de prueba? –

Cuestiones relacionadas