Signatur
Beschreibung
gethostbyaddr() führt einen Reverse-DNS-Lookup durch: Gegeben eine IP-Adresse (IPv4 oder IPv6) wird der zugehörige Hostname vom DNS-Server abgefragt. Das Ergebnis entspricht dem PTR-Record der übergebenen Adresse.
Kann kein Hostname ermittelt werden – etwa weil kein PTR-Eintrag existiert –, gibt die Funktion die ursprüngliche IP-Adresse unverändert zurück. Bei einem ungültigen Eingabewert (kein gültiges IP-Format) wird false zurückgegeben.
Typische Anwendungsfälle sind Logging (Hostnamen in Logdateien), einfache Herkunftsprüfungen oder die Anzeige von Verbindungsinformationen in Administrationsoberflächen. Achtung: DNS-Einträge sind fälschbar – der ermittelte Hostname sollte niemals als Sicherheitsmerkmal verwendet werden, ohne ihn anschließend mit gethostbyname() gegenzuprüfen (Forward-Confirmed Reverse DNS).
Der Aufruf ist blockierend und abhängig von der Antwortzeit des DNS-Servers; in zeitkritischen Anwendungen kann dies zu spürbaren Verzögerungen führen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $ip Pflicht | string | Eine gültige IPv4- oder IPv6-Adresse in dezimaler Punkt- bzw. Doppelpunkt-Notation, z. B. "93.184.216.34" oder "::1". |
Rückgabewert
false zurückgegeben.Beispiele
Einfacher Reverse-DNS-Lookup
<?php
$ip = '8.8.8.8';
$hostname = gethostbyaddr($ip);
if ($hostname === false) {
echo "Ungültige IP-Adresse angegeben.\n";
} elseif ($hostname === $ip) {
echo "Kein PTR-Record für {$ip} gefunden.\n";
} else {
echo "Hostname für {$ip}: {$hostname}\n";
}
Forward-Confirmed Reverse DNS (FCrDNS) zur Verifikation
<?php
/**
* Prüft, ob der Reverse-DNS-Hostname auch vorwärts zur gleichen IP auflöst.
* Verhindert, dass gefälschte PTR-Einträge akzeptiert werden.
*/
function fcrdns(string $ip): string|false {
$hostname = gethostbyaddr($ip);
if ($hostname === false || $hostname === $ip) {
return false; // Kein PTR-Record oder ungültige IP
}
// Vorwärts-Lookup zur Bestätigung
$resolvedIp = gethostbyname($hostname);
return ($resolvedIp === $ip) ? $hostname : false;
}
$ip = $_SERVER['REMOTE_ADDR'] ?? '127.0.0.1';
$verifiedHost = fcrdns($ip);
if ($verifiedHost !== false) {
echo "Verifizierter Hostname: {$verifiedHost}\n";
} else {
echo "Hostname konnte nicht verifiziert werden.\n";
}
// Wichtig · Fallstricke
Sicherheitshinweis: PTR-Records können von jedem DNS-Administrator frei gesetzt werden und sind daher kein vertrauenswürdiges Sicherheitsmerkmal. Wer auf Basis des Hostnamens Zugriffskontrollen oder Authentifizierungsentscheidungen trifft, muss zwingend einen Forward-Confirmed Reverse DNS (FCrDNS) durchführen: erst gethostbyaddr(), dann gethostbyname() auf das Ergebnis – und prüfen, ob die resultierende IP mit der ursprünglichen übereinstimmt.
Performance: Der Aufruf blockiert den PHP-Prozess, bis der DNS-Server antwortet oder ein Timeout eintritt. In Web-Requests unter hoher Last kann dies die Antwortzeit deutlich erhöhen. Erwäge Caching oder asynchrone Verarbeitung.
IPv6: Ab PHP 5.3 wird IPv6 unterstützt, sofern das Betriebssystem und die Resolver-Bibliothek es unterstützen.