W3docs

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 false y 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ámetroTipoDescripción
$ipstringLa 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:

php— editable, runs on the server

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 === $ip en lugar de asumir que un resultado que no es false es 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() con FILTER_VALIDATE_IP antes de llamar a gethostbyaddr().
  • 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.

Práctica

Práctica
¿Qué hace la función gethostbyaddr() en PHP?
¿Qué hace la función gethostbyaddr() en PHP?
Was this page helpful?