Vergleich VARBINARY (IP's)
Theodor
- datenbank
Hallo,
ich stehe gerade etwas auf dem Schlauch was den Vergleich zwischen IP's in einem VARBINARY(16) Feld angeht.
Ich habe mittels inet_pton IP-Ranges in der DB abgelegt (RangeFrom, RangeTill).
Jetzt möchte ich schaun ob eine gegebene IP in einer der hinterlegten Ranges passt.
z.B.
Range: 178.203.0.0 - 178.203.255.255
gegebene IP: 178.203.34.137
Die Abfrage ist wie folgt:
mysql_query("SELECT * FROM ip_ranges WHERE RangeFrom <= " . mysql_real_escape_string(inet_pton($ip)) . " AND RangeTill >= " . mysql_real_escape_string(inet_pton($ip)))
Allerdings bekomme ich nichts zurück. Also scheint der Vergleich von VARBINARY Feldern nicht so zu klappen, wie ich es mir erhofft hatte.
Laut MySQL-Doc werden die Einträge Byteweise verglichen, also sollte das doch passen?!?
Kann mir da bitte jemand helfen?
Danke
MFG Theodor
Also ich hab jetzt mal der HEX Funktion bedient, und siehe da es geht. Ob es nur Zufall ist, oder ob es allgemein klappt wird sich zeigen.
mysql_query("SELECT * FROM ip_ranges WHERE HEX(RangeFrom) <= HEX(" . mysql_real_escape_string(inet_pton($ip)) . ") AND HEX(RangeTill) >= HEX(" . mysql_real_escape_string(inet_pton($ip)) . ")")
Wobei es auch an der MySQL Version zu liegen scheint. Mit der v.5.1.x funktioniert es nur mit HEX. Hab mal meinen Testserver auf v.5.5.x aktualisiert, und siehe da, es geht auch ohne. Updates haben ihren Sinn also noch nicht verloren...
Tach!
mysql_query("SELECT * FROM ip_ranges WHERE HEX(RangeFrom) <= HEX(" . mysql_real_escape_string(inet_pton($ip)) . ") AND HEX(RangeTill) >= HEX(" . mysql_real_escape_string(inet_pton($ip)) . ")")
mysql_real_escape_string() behandelt Werte für den String-Kontext. Wenn du keinen solchen mit (einfachen oder doppelten) Anführungszeichen einleitest, bringt dir diese Funktion sicherheitstechnisch gar nichts. Zudem notierst du keinen String sondern irgendwas anderes.
dedlfix.
Ja die Apostrophe habe ich bei meinen Beispielen vergessen. So habe ich diese natürlich ;) Und ich füge Binärdaten ein, also ist mysql_real_escape_string schon nötig.
Tach!
Ja die Apostrophe habe ich bei meinen Beispielen vergessen. So habe ich diese natürlich ;) Und ich füge Binärdaten ein, also ist mysql_real_escape_string schon nötig.
Du könntest auf mysqli und Prepared Statements umsteigen, dann ist sowas gar nicht mehr nötig. Wenn du die Anführungszeichen stehen hast, müsste das Einfügen ohne HEX() eigentlich gehen.
Zu deinem HEX() fällt mir grad noch ein, damit erzeugst du einen String. Und den kannst du im Prinzip auch in VARCHAR unterbringen und brauchst kein Binärfeld mehr.
dedlfix.
Ein Umstieg auf mysqli wäre für mein Projekt mit einem ziemlichen Mehraufwand verbunden. Der Einsatz von mysqli ist zwar geplant, aber erst für später.
Und ich füge ja nichts ein, sondern suche etwas, und das klappt bei der MySQL Version 5.1.x halt nur mit HEX. Und die Daten bleiben im Binärfeld. Die Suche auf dieser Table ist nur ein kleiner Teil. Andere Operationen auf dieser Table benötigen kein HEX, daher würde ich mir Mehrarbeit schaffen bzw. dem Server.