Zum Hauptmenü

Unterscheidung von IPv6- und IPv4-Adressen in PHP

Jörg Kruse

Auf meiner Webseite Meine Browser-Daten lass ich neben der IP-Adresse und dem User-Agent-String weitere Browser-Daten ausgeben, die auch bei der Webprogrammierung von Nutzen sind. Da sowohl auf meinem Webserver als auch auf meinem Router eine Dualstack-Verbindung eingerichtet ist, wurde mir stets die IPv6-Adresse meines PCs angezeigt. Die IPv4-Adresse kann ich zwar auch in meinem Router einsehen (unter „WAN-IP“), aber ich dachte mir, dass es ganz nett wäre, wenn meine Browser-Daten-Seite diese gleich mit anzeigt.

Wenn beide Versionen der IP-Adressen ausgegeben werden sollen, muss als erstes die IP-Adresse des Requests einer IP-Version zugeordnet werden. In PHP gelingt eine Unterscheidung recht einfach mit der Funktion filter_var() oder filter_input() sowie den Flags FILTER_FLAG_IPV6 und FILTER_FLAG_IPV4, wie hier im Beispiel-Code:


if (filter_var($ip_adress, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
    echo 'ipv6 address';
} elseif (filter_var($ip_adress, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
    echo 'ipv4 address';
} else {
    echo 'no valid ip address';
}

Handelt es sich hierbei um eine IPv4-Adresse, war es das schon, da der entfernte Rechner wohl über keine Dualstack-Verbindung verfügt. Handelt es sich hierbei um eine IPv6-Adresse, dann wollte ich ja noch die IPv4-Adresse ermitteln. Hierzu habe ich im DNS-Zonefile eine Subdomain nur mit A-Record, aber ohne AAAA-Record angelegt, so dass auf diese nur mit IPv4-Adressen zugegriffen wird. Ein PHP-Script auf der Subdomain gibt diese Adresse aus, so dass ein JavaScript der Browser-Daten-Seite diese per Fetch-API abrufen und in das betreffende Datenfeld der Seite einfügen kann.

Tags: PHP

Kommentar schreiben

Erlaubte HTML-Tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Kommentare werden erst nach Freischaltung veröffentlicht