Beiträge: 167
Themen: 28
Registriert seit: 29.11.2005
11.04.2009, 18:32
(Dieser Beitrag wurde zuletzt bearbeitet: 14.04.2009, 14:14 von Michael.)
Hallo,
ich habe ein kleines Problem. Irgendwie nimmt MyBB die Platzhalter in der IP-Suche nicht so wirklich an. Für die letzte Zahl funktioniert der Platzhalter, sagen wir mal, ich suche nach 175.129.32.*, dann läuft's. Suche ich allerdings nach 175.129.* oder 175.129.*.* oder 175.129.*** oder 175.129**** funktioniert es nicht, und das ist genau das, was ich benötige, weil die Provider in der Regel die letzten beiden Zahlen ändern und ich nur so die möglichen doppelten Accounts finden kann.
Gibt es eine Methode nach IP-Bereichen zu suchen?
Beiträge: 167
Themen: 28
Registriert seit: 29.11.2005
Beiträge: 25.766
Themen: 269
Registriert seit: 20.09.2005
Ich denke, dass das eine technische Beschränkung ist.
Bitte die Foren-Regeln beachten und im Profil die verwendete MyBB-Version angeben.
Beiträge: 18.383
Themen: 257
Registriert seit: 09.02.2005
14.04.2009, 13:18
(Dieser Beitrag wurde zuletzt bearbeitet: 14.04.2009, 14:24 von Michael.)
Versuchs mal bitte damit. Öffne die Datei inc/functions.php und suche nach:
PHP-Code: function fetch_longipv4_range($ip) { $ip_bits = explode(".", $ip);
if($ip == "*") return array(ip2long(0), ip2long(255));
if(strpos($ip, ".*") === false) { $ip = str_replace("*", "", $ip); if(count($ip_bits) == 4) { return ip2long($ip); } else { return array(ip2long($ip.".0"), ip2long($ip.".255")); } } // Wildcard based IP provided else { foreach($ip_bits as $piece) { if($piece == "*") { return array(ip2long($ip_string."0"), ip2long($ip_string."255")); } else { $ip_string .= $piece."."; } } } }
Ersetzen durch:
PHP-Code: function fetch_longipv4_range($ip) { $ip_bits = explode(".", $ip); $ip_string1 = $ip_string2 = "";
if($ip == "*") return array(ip2long('0.0.0.0'), ip2long('255.255.255.255'));
if(strpos($ip, ".*") === false) { $ip = str_replace("*", "", $ip); if(count($ip_bits) == 4) { return ip2long($ip); } else { return array(ip2long($ip.".0"), ip2long($ip.".255")); } } // Wildcard based IP provided else { $sep = ""; foreach($ip_bits as $piece) { if($piece == "*") { $ip_string1 .= $sep."0"; $ip_string2 .= $sep."255"; } else { $ip_string1 .= $sep.$piece; $ip_string2 .= $sep.$piece; } $sep = "."; } return array(ip2long($ip_string1), ip2long($ip_string2)); } }
Danach sollte die Suche nach "175.129.*.*" funktionieren.
Gruß,
Michael
Support erfolgt NUR im Forum!
Bitte gelöste Themen als "erledigt" markieren.
Beiträge mit mangelhafter Rechtschreibung/Grammatik werden kommentarlos gelöscht.
Beiträge: 167
Themen: 28
Registriert seit: 29.11.2005
Danke, läuft. Allerdings beim Testen der neuen Funktion einen anderen Fehler gefunden: Einige IPs werden nicht gefunden, obwohl sie definitiv in der DB sind. Leider erkenne ich keinen wirklichen Zusammenhang zw. diesen nicht gefundenen IPs. Ich vermute aber, dass es die User trifft, die in einer von mir erstellten Gruppe sind, allerdings auch dort nicht alle, sondern nur ein paar. Die normalen Benutzer werden immer gefunden.
Beiträge: 18.383
Themen: 257
Registriert seit: 09.02.2005
Gruß,
Michael
Support erfolgt NUR im Forum!
Bitte gelöste Themen als "erledigt" markieren.
Beiträge mit mangelhafter Rechtschreibung/Grammatik werden kommentarlos gelöscht.
Beiträge: 167
Themen: 28
Registriert seit: 29.11.2005
Wenn ich es richtig verstehe, werden zu lange IPs nicht in die DB eingetragen, weil sie nicht passen, und daher nicht gefunden. Bei mir sind aber die IPs, die nicht gefunden werden, in der DB, also in der Spalte longipaddress unter mybb_posts.
Wie wird denn longipaddress erzeugt?
Beiträge: 25.766
Themen: 269
Registriert seit: 20.09.2005
Du kannst ja versuchen den Wert zurück zu wandeln und schauen, ob er wirklich stimmt.
Funktion: http://de.php.net/manual/de/function.ip2long.php
Bitte die Foren-Regeln beachten und im Profil die verwendete MyBB-Version angeben.
Beiträge: 167
Themen: 28
Registriert seit: 29.11.2005
Tatsächlich. Die grösste Zahl ist 2147483647, während die IP drüber ist. Also die betroffenen Spalten in bigint ändern?
Beiträge: 18.383
Themen: 257
Registriert seit: 09.02.2005
Einen zufriedenstellenden Fix gibt es noch nicht. Allerdings können die verlorenen Daten im Nachhinein nicht mehr hergestellt werden, d.h. auch nach der Fehlerbehebung wird die Suche in den schon vorhandenen Daten nicht funktionieren.
Alternative (aber ressourcenintensiver): Öffne die Datei modcp.php und suche nach:
PHP-Code: // IPv6 IP if(strpos($mybb->input['ipaddress'], ":") !== false) { $post_ip_sql = "ipaddress LIKE '".$db->escape_string(str_replace("*", "%", $mybb->input['ipaddress']))."'"; } else { $ip_range = fetch_longipv4_range($mybb->input['ipaddress']); if(!is_array($ip_range)) { $post_ip_sql = "longipaddress='{$ip_range}'"; } else { $post_ip_sql = "longipaddress > '{$ip_range[0]}' AND longipaddress < '{$ip_range[1]}'"; } }
Ersetzen durch:
PHP-Code: $post_ip_sql = "ipaddress LIKE '".$db->escape_string(str_replace("*", "%", $mybb->input['ipaddress']))."'";
Suche nach:
PHP-Code: // IPv6 IP if(strpos($mybb->input['ipaddress'], ":") !== false) { $user_ip_sql = "regip LIKE '".$db->escape_string(str_replace("*", "%", $mybb->input['ipaddress']))."' OR lastip LIKE '".$db->escape_string(str_replace("*", "%", $mybb->input['ipaddress']))."'"; } else { $ip_range = fetch_longipv4_range($mybb->input['ipaddress']); if(!is_array($ip_range)) { $user_ip_sql = "longregip='{$ip_range}' OR longlastip='{$ip_range}'"; } else { $user_ip_sql = "(longregip > '{$ip_range[0]}' AND longregip < '{$ip_range[1]}') OR (longlastip > '{$ip_range[0]}' AND longlastip < '{$ip_range[1]}')"; } }
Ersetzen durch:
PHP-Code: $user_ip_sql = "regip LIKE '".$db->escape_string(str_replace("*", "%", $mybb->input['ipaddress']))."' OR lastip LIKE '".$db->escape_string(str_replace("*", "%", $mybb->input['ipaddress']))."'";
Gruß,
Michael
Support erfolgt NUR im Forum!
Bitte gelöste Themen als "erledigt" markieren.
Beiträge mit mangelhafter Rechtschreibung/Grammatik werden kommentarlos gelöscht.
|