2009-09-19 12 views

risposta

6

E il conteggio del numero di '.' e/o ':' in $_SERVER["REMOTE_ADDR"]?

Se v'è più di 0 ':', e nessun simbolo '.' in $_SERVER["REMOTE_ADDR"], suppongo che si può considerare te utente è connesso tramite IPv6.


Un'altra soluzione potrebbe essere quella di utilizzare il filter extension: ci sono constants(vedere la fine della pagina) che sembrano essere correlati a IPv4 e IPv6:

FILTER_FLAG_IPV4 (intero)
Consentire solo indirizzo IPv4 nel filtro "validate_ip" .

FILTER_FLAG_IPV6 (intero)
consentire indirizzo IPv6 solo in filtro "validate_ip".

+5

Non date per scontato che se ci sono '' è un IPv4, IPv6 può anche contenere indirizzi in stile IPv4 es .: 0: 0: 0: 0: 0: 127.0.0.1 – Christian

2

Gli indirizzi IPv4 corrispondono alla regex /^\d{1,3}(\.\d{1,3}){3,3}$/.

+1

sembra che faccia il lavoro. ma hey ....è espressione regolare! può fare tutto, se solo sai come ... –

22

È possibile utilizzare questo:

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

sì ... sembra essere più veloce –

+3

Su un server dual stack (che è la solita implementazione) questo tornerà sempre '6' a causa di [Indirizzi IPv6 mappati IPv4] (https://en.wikipedia.org/wiki/IPv6#IPv4-mapped_IPv6_addresses). Per risolvere questo problema, controlla anche che la stringa non inizi con ':: ffff:' (e probabilmente vuoi rimuovere anche quello). –

+0

Le soluzioni di cui sopra utilizzando le espressioni regolari sono buone, ma non dimenticare di controllare che il tuo server supporti anche IPv6 in primo luogo! Molti amministratori di sistema hanno IPv6 disattivato perché causa un sacco di mal di testa. (Molte applicazioni sono state scritte esclusivamente pensando a IPv4). – invertedlambda

4

Dal momento che il più alto votato risposta ha un problema piuttosto rilevante, ho intenzione di condividere la mia.

Restituisce true se viene passato un indirizzo che sembra essere IPv6 e falso se viene passato un indirizzo che sembra essere IPv4 (o IPv6 mappato IPv4). Gli indirizzi effettivi non vengono ulteriormente convalidati; utilizzare filter_var() se è necessario convalidarli.

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

grazie brah, funziona – Skyzer

+0

indirizzo mappato ipv4 non è ancora valido indirizzo ipv4, perché lo contatterebbe come ipv4? –

+0

@CemKalyoncu perché da un punto di vista della rete, quando si dispone di un IPv4 mappato, non è in uso alcun IPv6, quindi se è necessario eseguire una ricerca DNS inversa o qualcosa di simile, dovrà essere un IPv4. – Ale

26

Controllare per IPv4

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

Verificare la presenza di 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"; 
} 

Per di più, controllare funzione PHP filter_vars e list of filters for validation.

+2

Infine, una soluzione ** nativa ** – mate64

3

È possibile utilizzare inet_pton:

<?php 

$packedIp = inet_pton($ip); 

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

È possibile utilizzare AF_INET6 per rilevare ipv6 in PHP:

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