2012-09-15 16 views
5

Sono di fronte a un problema con $ _SERVER ['REMOTE_ADDR'] in PHP Sta dando un valore simile a IPv6 anche se il server utilizza IPv4.

Qualcuno può aiutarmi a risolvere questo problema.

+0

Sei sicuro che il server è in esecuzione su IPv4? –

+2

Questo perché il tuo server web è vincolante per [::], non 0.0.0.0. –

risposta

15

Il server accetta le connessioni su un socket IPv6. Alcuni sistemi operativi possono eseguire sia IPv4 che IPv6 su un socket IPv6. Quando ciò accade, l'indirizzo IPv6 apparirà come ::ffff:192.0.2.123 o ::ffff:c000:027b, che è lo stesso indirizzo ma scritto in esadecimale.

Se vedete indirizzi IPv6 come 2a00:8640:1::224:36ff:feef:1d89 allora il vostro server web davvero è raggiungibile su IPv6 :-)

In ogni caso, per convertire tutto torna ad una forma canonica si può usare qualcosa come:

// 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); 

Utilizzando questo codice, quando si immette una delle seguenti opzioni:

::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 

si ottiene sempre la canonica l Indirizzo IPv4 192.0.2.123 come output.

E naturalmente indirizzi IPv6 ottenere restituito come indirizzi IPv6 canoniche: 2a00:8640:0001:0000:0224:36ff:feef:1d89 diventa 2a00:8640:1::224:36ff:feef:1d89 ecc

+0

Grazie. Farò qualcosa per filtrare l'IP. – Brijesh

+0

Ho provato ad aggiungere tutti gli esempi al mio script di test e non eseguo mai lo striping del prefisso. Ci sono troppi 0 nel tuo codice di esempio per tutti i tuoi esempi? –

+0

No, tutti gli esempi sono validi. Puoi mostrare il tuo script di test? –

Problemi correlati