Start · Sprachen · PHP · Referenz · gethostbyaddr

gethostbyaddr

Funktion

Löst eine IPv4- oder IPv6-Adresse in den zugehörigen Hostnamen auf (Reverse-DNS-Lookup).

seit PHP 4.0.0 Kategorie: http

Signatur

gethostbyaddr(string $ip): string|false

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

Typ
string|false
Beschreibung
Den aufgelösten Hostnamen als String, falls ein PTR-Record vorhanden ist. Existiert kein PTR-Record, wird die ursprüngliche IP-Adresse zurückgegeben. Bei einer ungültigen IP-Adresse wird 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";
}
Hostname für 8.8.8.8: dns.google

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.