Fonction PHP gethostbyaddr() : tout ce que vous devez savoir
Découvrez la fonction PHP gethostbyaddr() pour effectuer une recherche DNS inverse et obtenir le nom d'hôte associé à une adresse IP.
Lorsque vous disposez d'une adresse IP et souhaitez connaître le nom d'hôte correspondant, la fonction gethostbyaddr() de PHP fait le travail. Elle effectue une recherche DNS inverse — l'opération inverse de la résolution d'un nom de domaine en adresse IP. Cet article couvre sa syntaxe, sa valeur de retour, ses cas d'utilisation courants et les pièges à éviter.
Qu'est-ce que la fonction gethostbyaddr() ?
La fonction gethostbyaddr() est une fonction PHP intégrée qui effectue une recherche DNS inverse (rDNS) pour récupérer le nom d'hôte enregistré pour une adresse IP donnée. Elle s'appuie sur le résolveur DNS du système, donc le résultat dépend du réseau sur lequel le script s'exécute et du fait que le propriétaire de l'IP ait configuré un enregistrement PTR.
Points clés à retenir :
- Elle accepte une adresse IPv4 ou IPv6 sous forme de string.
- En cas de succès, elle retourne le nom d'hôte sous forme de string.
- En cas d'échec de résolution, elle retourne la string de l'adresse IP d'origine inchangée — pas
false. C'est la surprise comportementale principale, et cela détermine la façon dont vous devez vérifier le résultat. - En cas d'argument invalide (une string qui n'est pas une adresse IP valide), elle retourne
falseet émet un avertissement.
Une recherche inverse ne réussit que si le propriétaire du bloc IP a publié un enregistrement PTR. De nombreuses adresses (y compris la plupart des IP résidentielles et de nombreuses IP cloud) n'ont pas de PTR ou en ont un qui ne correspond pas à l'enregistrement direct, donc un nom d'hôte « manquant » est normal et ne constitue pas une erreur dans votre code.
Syntaxe
gethostbyaddr(string $ip): string|false| Paramètre | Type | Description |
|---|---|---|
$ip | string | L'adresse IPv4 ou IPv6 à rechercher. |
Valeur de retour : le nom d'hôte en cas de succès, la string $ip inchangée si aucun nom d'hôte n'a pu être trouvé, ou false si $ip n'est pas une adresse valide.
Exemple de base
Comme la fonction retourne l'IP elle-même en cas d'échec de résolution, vous comparez le résultat avec la valeur d'entrée pour détecter l'échec :
Ici, 8.8.8.8 (Google Public DNS) se résout en un nom d'hôte tel que dns.google. La vérification en trois étapes distingue une entrée invalide (false), une adresse non résolue (retourne l'IP) et une recherche réussie.
Résoudre le nom d'hôte du visiteur
Un cas d'utilisation courant est la journalisation ou l'analytique : transformer l'adresse IP d'un visiteur en un nom d'hôte lisible.
<?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.";
?>N'utilisez pas le résultat pour le contrôle d'accès. Le DNS inverse peut être usurpé par quiconque contrôle l'enregistrement PTR de l'IP, donc un nom d'hôte comme example.com ne prouve rien en soi. Pour un DNS inverse confirmé en avant (FCrDNS), recherchez le nom d'hôte avec gethostbyaddr() puis confirmez qu'il se résout vers la même IP avec gethostbyname().
Aller-retour avec gethostbyname()
gethostbyaddr() et gethostbyname() sont des inverses l'une de l'autre. Vous pouvez les utiliser ensemble pour vérifier qu'un nom d'hôte et une adresse IP correspondent réellement :
<?php
$ip = "8.8.8.8";
$host = gethostbyaddr($ip);
$confirmed = gethostbyname($host) === $ip;
echo "Host: $host\n";
echo "Forward-confirmed: " . ($confirmed ? "yes" : "no") . "\n";
?>Quand $confirmed vaut yes, les deux directions de la recherche DNS concordent — c'est le signal le plus fort que vous puissiez obtenir par DNS simple que le nom d'hôte est légitime.
Pièges courants
- Une IP retournée n'est pas une erreur. Vérifiez toujours
$result === $ipplutôt que de supposer qu'un résultat non-falseest un nom d'hôte. - Les recherches sont lentes et bloquantes. Chaque appel peut attendre un aller-retour réseau. Évitez de l'appeler dans une boucle serrée à chaque requête ; mettez les résultats en cache dans la mesure du possible.
- Validez l'entrée d'abord. Si la valeur peut ne pas être une adresse IP valide, passez-la par
filter_var()avecFILTER_VALIDATE_IPavant d'appelergethostbyaddr(). - Les résultats varient selon l'environnement. La même IP peut retourner des noms d'hôtes différents (ou aucun) selon les serveurs DNS configurés là où le script s'exécute.
Fonctions associées
gethostbyname()— résoudre un nom d'hôte en adresse IPv4 (la recherche directe).gethostbynamel()— obtenir la liste complète des adresses IPv4 pour un nom d'hôte.gethostname()— obtenir le nom d'hôte de la machine locale.checkdnsrr()— vérifier si des enregistrements DNS d'un type donné existent pour un hôte.ip2long()— convertir une adresse IPv4 en sa représentation entière.
Conclusion
La fonction gethostbyaddr() effectue une recherche DNS inverse, transformant une adresse IP en nom d'hôte. Le détail crucial est son comportement de retour : elle renvoie l'IP d'origine si aucun nom d'hôte n'est trouvé, et false uniquement pour une entrée invalide — vérifiez donc le résultat avec soin. Associez-la à gethostbyname() lorsque vous avez besoin d'un DNS inverse confirmé en avant, et ne faites jamais confiance à une recherche inverse non vérifiée pour des décisions de sécurité.