Rechnen mit IP-Adressen, Adressräume bestimmen

Manchmal kann es ganz schön nützlich sein, wenn man IP-Adressen (zum Beispiel in der Form 192.168.0.1) so umrechnen kann, dass sie wie Zahlen verwendet werden können. Ein Beispielszenario:

In einer Datenbank befinden sich IP-Adressbereiche sowie die Regionen, denen diese Adressen zugeteilt sind. Möchte man nun herausfinden, zu welcher Region eine IP-Adresse gehört, müsste man eine Datenbankabfrage ausführen können, die so etwas möglich macht:

Finde Zeile, in der Wert >= von und Wert <= bis

Oder in SQL:


SELECT FROM ip2region WHERE $ip >= ip_from and $ip <= ip_from;

Damit genau das klappt, müssen wir unsere IP-Adressen in Dezimalzahlen umwandeln. Im Prinzip geht das so:


Die IP-Adresse wird in ihre Oktette aufgetrennt. Aus 192.168.0.1 wird 192, 168, 0 und 1.

Das erste Oktett wird mit 256³ multipliziert, das zweite mit 256², das dritte mit 256, das vierte mit 1. Diese werden anschließend addiert.

192*256³ + 168*256² + 0*256 + 1*1

Als Dezimalzahl ausgedrückt wird aus unserer IP-Adresse

3232235521.

Angenommen, wir haben einen Adressbereich, der von 192.168.0.1 bis 192.168.0.16 reicht und suchen die Adresse 192.168.0.4, dann landen wir mit der oben aufgeschriebenen Abfrage und in dezimal umgerechneten IP-Adressen einen Volltreffer, weil 3232235524 zwischen 3232235521 und 3232235536 liegt.

Bevor Sie jetzt selbst nach Wegen suchen, IP-Adressen per Explode zu trennen und mit Foreach und Ausnahmen zu behandeln… PHP stellt bereits die Funktion ip2long() bereit, die recht einfach zu verwenden ist:

function getDecimalIP(){
    return ip2long($_SERVER['REMOTE_ADDR']);
}

Dieser Beitrag wurde unter Datenbanken, Rechnen abgelegt und mit , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.