W3docs

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 false ed 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
ParametroTipoDescrizione
$ipstringL'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:

php— editable, runs on the server

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 === $ip invece di presumere che un risultato diverso da false sia 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() con FILTER_VALIDATE_IP prima di chiamare gethostbyaddr().
  • 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.

Esercitazione

Pratica
Cosa fa la funzione gethostbyaddr() in PHP?
Cosa fa la funzione gethostbyaddr() in PHP?
Was this page helpful?