MyBB.de Forum

Normale Version: [G] IP-Suche mit den Platzhaltern
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,

ich habe ein kleines Problem. Big Grin 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?
Ein Bug?
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.
Das könnte mit diesem Fehler zusammenhängen: http://community.mybboard.net/thread-46978.html
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?
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
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']))."'"