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?
Ich denke, dass das eine technische Beschränkung ist.
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.
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.
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?
Tatsächlich. Die grösste Zahl ist 2147483647, während die IP drüber ist. Also die betroffenen Spalten in bigint ändern?
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']))."'";