Función PHP gethostbyaddr(): Todo lo que necesitas saber
Como desarrollador PHP, puedes necesitar obtener el nombre de host de una IP. La función gethostbyaddr() de PHP es perfecta para esto.
Cuando tienes una dirección IP y quieres saber el nombre de host que hay detrás, la función gethostbyaddr() de PHP hace el trabajo. Realiza una búsqueda DNS inversa — lo contrario de resolver un nombre de dominio a una IP. Este artículo cubre su sintaxis, valor de retorno, casos de uso comunes y los errores frecuentes que suelen confundir a los desarrolladores.
¿Qué es la función gethostbyaddr()?
La función gethostbyaddr() es una función integrada de PHP que realiza una búsqueda DNS inversa (rDNS) para obtener el nombre de host registrado para una dirección IP dada. Depende del resolvedor DNS de tu sistema, por lo que el resultado depende de la red en la que se ejecuta el script y de que el propietario de la IP haya configurado un registro PTR.
Aspectos clave a tener en cuenta:
- Acepta una dirección IPv4 o IPv6 como string.
- En caso de éxito, devuelve el nombre de host como string.
- En caso de fallo al resolver, devuelve la string de la IP original sin cambios — no
false. Esa es la principal sorpresa de comportamiento, y determina cómo debes comprobar el resultado. - Con un argumento inválido (una string que no es una IP válida), devuelve
falsey emite una advertencia.
Una búsqueda inversa solo tiene éxito si el propietario del bloque IP ha publicado un registro PTR. Muchas direcciones (incluidas la mayoría de las residenciales y muchas IPs en la nube) no tienen PTR o tienen uno que no coincide con el registro directo, por lo que un nombre de host "ausente" es normal, no un error en tu código.
Sintaxis
gethostbyaddr(string $ip): string|false| Parámetro | Tipo | Descripción |
|---|---|---|
$ip | string | La dirección IPv4 o IPv6 a consultar. |
Valor de retorno: el nombre de host en caso de éxito, la string $ip sin cambios cuando no se encontró ningún nombre de host, o false si $ip no es una dirección válida.
Ejemplo básico
Dado que la función devuelve la propia IP cuando falla la resolución, se compara el resultado con la entrada para detectar el fallo:
Aquí 8.8.8.8 (DNS Público de Google) se resuelve a un nombre de host como dns.google. La comprobación en tres pasos distingue una entrada inválida (false), una dirección no resuelta (devuelve la IP) y una búsqueda exitosa.
Resolver el nombre de host del visitante
Un uso común es en registros o analíticas: convertir la IP de un visitante en un nombre de host legible.
<?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.";
?>No uses el resultado para el control de acceso. El DNS inverso puede ser falsificado por quien controle el registro PTR de la IP, por lo que un nombre de host como example.com no prueba nada por sí solo. Para DNS inverso confirmado hacia adelante (FCrDNS), busca el nombre de host con gethostbyaddr() y luego confirma que se resuelve de vuelta a la misma IP con gethostbyname().
Verificación de ida y vuelta con gethostbyname()
gethostbyaddr() y gethostbyname() son funciones inversas. Puedes usarlas juntas para verificar que un nombre de host y una IP coinciden genuinamente:
<?php
$ip = "8.8.8.8";
$host = gethostbyaddr($ip);
$confirmed = gethostbyname($host) === $ip;
echo "Host: $host\n";
echo "Forward-confirmed: " . ($confirmed ? "yes" : "no") . "\n";
?>Cuando $confirmed es yes, ambas direcciones de la búsqueda DNS coinciden — la señal más sólida que obtienes del DNS simple de que el nombre de host es legítimo.
Errores frecuentes
- Una IP devuelta no es un error. Comprueba siempre
$result === $ipen lugar de asumir que un resultado que no esfalsees un nombre de host. - Las búsquedas son lentas y bloqueantes. Cada llamada puede esperar un viaje de red de ida y vuelta. Evita llamarla en un bucle estrecho en cada solicitud; almacena en caché los resultados donde sea posible.
- Valida la entrada primero. Si el valor puede no ser una IP válida, pásalo por
filter_var()conFILTER_VALIDATE_IPantes de llamar agethostbyaddr(). - Los resultados varían según el entorno. La misma IP puede devolver distintos nombres de host (o ninguno) dependiendo de los servidores DNS configurados donde se ejecuta el script.
Funciones relacionadas
gethostbyname()— resuelve un nombre de host a una dirección IPv4 (la búsqueda directa).gethostbynamel()— obtiene la lista completa de direcciones IPv4 para un nombre de host.gethostname()— obtiene el nombre de host de la máquina local.checkdnsrr()— comprueba si existen registros DNS de un tipo determinado para un host.ip2long()— convierte una dirección IPv4 a su representación entera.
Conclusión
La función gethostbyaddr() realiza una búsqueda DNS inversa, convirtiendo una dirección IP en un nombre de host. El detalle crucial es su comportamiento de retorno: devuelve la IP original cuando no se encuentra ningún nombre de host y false solo para entradas inválidas, por lo que debes comprobar el resultado con cuidado. Combínala con gethostbyname() cuando necesites DNS inverso confirmado hacia adelante, y nunca confíes en una búsqueda inversa no verificada para decisiones de seguridad.