Funzione PHP gethostbyaddr(): tutto quello che devi sapere
Come sviluppatore PHP, potresti dover ottenere il nome host di un dato indirizzo IP. In questi scenari, la funzione PHP gethostbyaddr() fa al caso tuo.
Quando hai un indirizzo IP e vuoi conoscere il nome host corrispondente, la funzione gethostbyaddr() di PHP svolge questo compito. Esegue un reverse DNS lookup — l'operazione inversa rispetto alla risoluzione di un nome di dominio in un IP. Questo articolo ne illustra la sintassi, il valore restituito, i casi d'uso comuni e le insidie più frequenti.
Cos'è la funzione gethostbyaddr()?
La funzione gethostbyaddr() è una funzione built-in di PHP che esegue un reverse DNS (rDNS) lookup per recuperare il nome host registrato per un dato indirizzo IP. Si basa sul resolver DNS del sistema, quindi il risultato dipende dalla rete su cui viene eseguito lo script e dal fatto che il proprietario dell'IP abbia configurato un record PTR.
Punti chiave da tenere a mente:
- Accetta un indirizzo IPv4 o IPv6 come string.
- In caso di successo, restituisce il nome host come string.
- In caso di impossibilità di risoluzione, restituisce la string dell'indirizzo IP originale invariata — non
false. Questo è il principale comportamento sorprendente e determina il modo in cui occorre verificare il risultato. - In caso di argomento non valido (una string che non è un indirizzo IP valido), restituisce
falseed emette un avviso.
Un reverse lookup ha successo solo se il proprietario del blocco IP ha pubblicato un record PTR. Molti indirizzi (inclusa la maggior parte degli IP residenziali e molti IP cloud) non hanno un PTR oppure ne hanno uno che non corrisponde al record diretto, quindi un nome host "mancante" è normale, non un errore nel codice.
Sintassi
gethostbyaddr(string $ip): string|false| Parametro | Tipo | Descrizione |
|---|---|---|
$ip | string | L'indirizzo IPv4 o IPv6 da cercare. |
Valore restituito: il nome host in caso di successo, la string $ip invariata quando non viene trovato alcun nome host, oppure false se $ip non è un indirizzo valido.
Esempio di base
Poiché la funzione restituisce l'IP stesso quando la risoluzione fallisce, si confronta il risultato con l'input per rilevare il fallimento:
Qui 8.8.8.8 (Google Public DNS) si risolve in un nome host come dns.google. Il controllo a tre vie distingue un input non valido (false), un indirizzo non risolvibile (restituisce l'IP) e una ricerca riuscita.
Risoluzione del nome host del visitatore
Un utilizzo comune è il logging o l'analisi: convertire l'IP di un visitatore in un nome host leggibile.
<?php
$ip = $_SERVER['REMOTE_ADDR'] ?? '127.0.0.1';
$host = gethostbyaddr($ip);
echo $host === $ip
? "Visitor IP $ip has no reverse DNS entry."
: "Visitor came from $host.";
?>Non utilizzare il risultato per il controllo degli accessi. Il reverse DNS può essere falsificato da chiunque controlli il record PTR dell'IP, quindi un nome host come example.com non prova nulla di per sé. Per un DNS inverso confermato in avanti (FCrDNS), cerca il nome host con gethostbyaddr() e poi verifica che si risolva nuovamente nello stesso IP con gethostbyname().
Utilizzo combinato con gethostbyname()
gethostbyaddr() e gethostbyname() sono funzioni inverse. Puoi usarle insieme per verificare che un nome host e un IP corrispondano davvero:
<?php
$ip = "8.8.8.8";
$host = gethostbyaddr($ip);
$confirmed = gethostbyname($host) === $ip;
echo "Host: $host\n";
echo "Forward-confirmed: " . ($confirmed ? "yes" : "no") . "\n";
?>Quando $confirmed è yes, entrambe le direzioni del DNS lookup concordano — il segnale più affidabile che si può ottenere dal DNS semplice che il nome host è legittimo.
Insidie comuni
- Un IP restituito non è un errore. Verifica sempre
$result === $ipinvece di presumere che un risultato diverso dafalsesia un nome host. - Le ricerche sono lente e bloccanti. Ogni chiamata può attendere un round trip di rete. Evita di chiamarla in un ciclo stretto per ogni richiesta; memorizza i risultati nella cache dove possibile.
- Valida prima l'input. Se il valore potrebbe non essere un IP valido, passalo attraverso
filter_var()conFILTER_VALIDATE_IPprima di chiamaregethostbyaddr(). - I risultati variano in base all'ambiente. Lo stesso IP può restituire nomi host diversi (o nessuno) a seconda dei server DNS configurati dove viene eseguito lo script.
Funzioni correlate
gethostbyname()— risolve un nome host in un indirizzo IPv4 (il lookup diretto).gethostbynamel()— ottiene l'elenco completo degli indirizzi IPv4 per un nome host.gethostname()— ottiene il nome host della macchina locale.checkdnsrr()— verifica se esistono record DNS di un determinato tipo per un host.ip2long()— converte un indirizzo IPv4 nella sua rappresentazione intera.
Conclusione
La funzione gethostbyaddr() esegue un reverse DNS lookup, trasformando un indirizzo IP in un nome host. Il dettaglio cruciale è il suo comportamento di ritorno: restituisce l'IP originale quando non viene trovato alcun nome host e false solo per input non validi, quindi controlla il risultato con attenzione. Abbinala a gethostbyname() quando hai bisogno di un DNS inverso confermato in avanti, e non fidarti mai di un reverse lookup non verificato per decisioni di sicurezza.