PHP gethostbyaddr()-Funktion: Alles, was Sie wissen müssen
Als PHP-Entwickler müssen Sie möglicherweise den Hostnamen einer IP-Adresse ermitteln. Die Funktion gethostbyaddr() hilft dabei genau.
Wenn Sie eine IP-Adresse haben und den dahinterliegenden Hostnamen ermitteln möchten, erledigt die PHP-Funktion gethostbyaddr() diese Aufgabe. Sie führt eine Reverse-DNS-Abfrage durch — das Gegenteil der Auflösung eines Domainnamens zu einer IP. Dieser Artikel behandelt die Syntax, den Rückgabewert, gängige Anwendungsfälle und die Fallstricke, über die man leicht stolpert.
Was ist die gethostbyaddr()-Funktion?
Die gethostbyaddr()-Funktion ist eine in PHP integrierte Funktion, die eine Reverse-DNS-Abfrage (rDNS) durchführt, um den für eine bestimmte IP-Adresse registrierten Hostnamen abzurufen. Sie verlässt sich auf den DNS-Resolver des Systems, sodass das Ergebnis vom Netzwerk abhängt, in dem das Skript ausgeführt wird, und davon, ob der IP-Inhaber einen PTR-Eintrag konfiguriert hat.
Wichtige Fakten, die man im Kopf behalten sollte:
- Sie akzeptiert eine IPv4- oder IPv6-Adresse als string.
- Bei Erfolg gibt sie den Hostnamen als string zurück.
- Bei fehlgeschlagener Auflösung gibt sie den ursprünglichen IP-Adress-string unverändert zurück — nicht
false. Das ist die wichtigste Verhaltensüberraschung und bestimmt, wie das Ergebnis geprüft werden muss. - Bei einem ungültigen Argument (ein string, der keine gültige IP ist) gibt sie
falsezurück und gibt eine Warnung aus.
Eine Reverse-Abfrage ist nur erfolgreich, wenn der Inhaber des IP-Blocks einen PTR-Eintrag veröffentlicht hat. Viele Adressen (darunter die meisten privaten und viele Cloud-IPs) haben keinen PTR-Eintrag oder einen, der nicht mit dem Forward-Eintrag übereinstimmt. Ein „fehlender" Hostname ist daher normal und kein Fehler in Ihrem Code.
Syntax
gethostbyaddr(string $ip): string|false| Parameter | Typ | Beschreibung |
|---|---|---|
$ip | string | Die nachzuschlagende IPv4- oder IPv6-Adresse. |
Rückgabewert: der Hostname bei Erfolg, der unveränderte $ip-string, wenn kein Hostname gefunden wurde, oder false, wenn $ip keine gültige Adresse ist.
Einfaches Beispiel
Da die Funktion die IP selbst zurückgibt, wenn die Auflösung fehlschlägt, vergleichen Sie das Ergebnis mit der Eingabe, um einen Fehler zu erkennen:
Hier wird 8.8.8.8 (Google Public DNS) zu einem Hostnamen wie dns.google aufgelöst. Die dreigliedrige Prüfung unterscheidet eine ungültige Eingabe (false), eine nicht aufgelöste Adresse (gibt die IP zurück) und eine erfolgreiche Abfrage.
Den Hostnamen eines Besuchers ermitteln
Ein häufiger Anwendungsfall ist Logging oder Analyse: die IP eines Besuchers in einen lesbaren Hostnamen umzuwandeln.
<?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.";
?>Verwenden Sie das Ergebnis nicht für die Zugangskontrolle. Reverse-DNS kann von demjenigen gefälscht werden, der den PTR-Eintrag der IP kontrolliert. Ein Hostname wie example.com beweist daher für sich genommen nichts. Für vertrauenswürdiges Forward-Confirmed Reverse DNS (FCrDNS) schlagen Sie den Hostnamen mit gethostbyaddr() nach und bestätigen Sie anschließend, dass er mit gethostbyname() wieder zur gleichen IP aufgelöst wird.
Hin- und Rückübersetzung mit gethostbyname()
gethostbyaddr() und gethostbyname() sind Umkehrfunktionen. Sie können beide zusammen verwenden, um zu überprüfen, ob Hostname und IP wirklich übereinstimmen:
<?php
$ip = "8.8.8.8";
$host = gethostbyaddr($ip);
$confirmed = gethostbyname($host) === $ip;
echo "Host: $host\n";
echo "Forward-confirmed: " . ($confirmed ? "yes" : "no") . "\n";
?>Wenn $confirmed yes ist, stimmen beide Richtungen der DNS-Abfrage überein — das stärkste Signal, das Sie mit normalem DNS erhalten können, dass der Hostname legitim ist.
Häufige Fallstricke
- Eine zurückgegebene IP ist kein Fehler. Prüfen Sie immer
$result === $ip, anstatt davon auszugehen, dass ein Nicht-false-Ergebnis ein Hostname ist. - Abfragen sind langsam und blockierend. Jeder Aufruf kann auf einen Netzwerk-Roundtrip warten. Vermeiden Sie Aufrufe in einer engen Schleife bei jeder Anfrage; cachen Sie Ergebnisse, wo immer möglich.
- Eingabe zuerst validieren. Wenn der Wert möglicherweise keine gültige IP ist, führen Sie ihn durch
filter_var()mitFILTER_VALIDATE_IPaus, bevor Siegethostbyaddr()aufrufen. - Ergebnisse variieren je nach Umgebung. Dieselbe IP kann je nach den konfigurierten DNS-Servern, auf denen das Skript läuft, unterschiedliche Hostnamen (oder keinen) zurückgeben.
Verwandte Funktionen
gethostbyname()— einen Hostnamen in eine IPv4-Adresse auflösen (Forward-Abfrage).gethostbynamel()— die vollständige Liste der IPv4-Adressen für einen Hostnamen abrufen.gethostname()— den Hostnamen des lokalen Rechners abrufen.checkdnsrr()— prüfen, ob DNS-Einträge eines bestimmten Typs für einen Host existieren.ip2long()— eine IPv4-Adresse in ihre Integer-Darstellung umwandeln.
Fazit
Die gethostbyaddr()-Funktion führt eine Reverse-DNS-Abfrage durch und wandelt eine IP-Adresse in einen Hostnamen um. Das entscheidende Detail ist ihr Rückgabeverhalten: Sie gibt die ursprüngliche IP zurück, wenn kein Hostname gefunden wurde, und false nur bei ungültiger Eingabe — prüfen Sie das Ergebnis daher sorgfältig. Kombinieren Sie sie mit gethostbyname(), wenn Sie Forward-Confirmed Reverse DNS benötigen, und vertrauen Sie einer nicht verifizierten Reverse-Abfrage niemals für sicherheitsrelevante Entscheidungen.