Sönke Tesch: Check: IP in IP-Ranges?

Beitrag lesen

wie kann ich am einfachsten und am schonensten überprüfen, ob eine bestimmte IP in einer bestimmten IP-Range ist?

Als einfachstes dachte ich mir, ich könnte die IP-Grenzen (der Ranges) in 32-Bit-Zahlen umwandeln und die IP auch und dann ueber einfache größer/kleiner-Beziehungen feststellen, ob ein Fall eintritt:

Richtig.

// User muss gecheckt werden
    $ip = abs(ip2long($ip));

Das geht in die Hose. Nehmen wir mal ein 4-bittiges Beispiel:

8421
     ----
  14 1110
  -2 1110
   2 0010

Wie Du siehst, entspricht die "Adresse" 14 der Binärzahl 1110. Da ip2long() eine vorzeichenbehaftete Zahl ausspuckt, gibt die Funktion die Dezimalzahl -2 zurück. Machst Du daraus jetzt mit abs() einen positiven Wert, erhältst Du 0010, und das wiederum entspricht nicht dem ursprünglichen Wert 1110 (14).

Benutze wie in der PHP-Anleitung angegeben sprintf() mit dem Platzhalter %u. %u interpretiert die übergebenen Daten als vorzeichenlos und gibt dementsprechend für 1110 auch tatsächlich 14 aus.

$query = 'SELECT ip_start, ip_end FROM al_iprange WHERE ('.$ip.' >= ip_start AND '.$ip.' <= ip_end)';

$query = sprintf("SELECT ip_start,ip_end FROM al_iprange WHERE %u>=ip_start AND %u<=ip_end)",$ip);

Ich gehe mal davon aus, daß auch Dezimalzahlen in Deiner Tabelle hast.

Aber irgendwie scheint das nicht zu klappen :(

"Geht nicht", das ist eine Fehlerbeschreibung, wie ich sie liebe :/ So überaus präzise und ausführlich, daß man sich vor Informationen garnicht mehr retten kann.
Ist Dir das Problem nicht wichtig genug, daß Du nichtmal ein paar Beispielzahlen mitliefern konntest?

Gruß,
  soenk.e