Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13

Discussione: Confronto IP

  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2004
    Messaggi
    376

    Confronto IP

    Ho una tabella con degli ip nei seguenti formati:

    192.168.1.1
    192.168.1.*
    192.168.*.*
    192.*.*.*

    Con questo codice vedo se l'IP del visitatore è tra quelli nel db, se sì devo bannarlo:

    Codice PHP:
    $iputente explode(".",$_SERVER['REMOTE_ADDR']); 
    $sql mysql_query("SELECT ip FROM ip_tab ORDER BY ip ASC");

    while (
    $row mysql_fetch_array($sql)) {                    
      
    $ip_db explode("."$row['ip']); 
      if ((
    $ip_db[0]==$iputente[0]) && ($ip_db[1]==$iputente[1] || $ip_db[1]=='*') && ($ip_db[2]==$iputente[2] || $ip_db[2]=='*') && ($ip_db[3]==$iputente[3] || $ip_db[3]=='*')) { 
      echo 
    "bannato";
    } else {
      echo 
    "ok";
     }

    Se nel db ho un intero range e l'ip del visitatore è, ipotesi, 192.168.1.2:

    192.168.1.1
    192.168.1.2
    192.168.1.3
    ...

    il codice non funziona cioè non lo riconosce come bannato. In tutti gli altri casi (ip con * o singolo) invece funziona.
    Come mai? Sbaglio la query o cosa?

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    in effetti sembrerebbe corretto, ma evidentemente no, se dici che non va... basta che stampi a video $ip_db ed $ip_utente dentro il ciclo (eventualmente posta i risultati)...

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2004
    Messaggi
    376
    ho aggiunto nel while:
    Codice PHP:
    echo "ip db " $ip_db[0] . '.' $ip_db[1] . '.' $ip_db[2] . '.' $ip_db[3] . "
    "
    ;
    echo 
    "ip utente " $iputente[0] . '.' $iputente[1] . '.' $iputente[2] . '.' $iputente[3] . "
    "

    e il risultato è:

    ip db 127.0.0.0
    ip utente 127.0.0.1
    ip db 127.0.0.1
    ip utente 127.0.0.1
    ip db 127.0.0.2
    ip utente 127.0.0.1

    Ovviamente, in locale l'ip è 127.0.0.1 e come range ho inserito solo 3 IP. Lo script come dicevo, anche stavolta non l'ha riconosciuto come bannato.

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    puoi postare l'output completo (non ci sono i vari "ok" o "bannato"...) cambiando le due righe "echo" che hai messo nel dump questo:



    Codice PHP:
    var_export($ip_db);
    var_export($iputente);
    var_export(array (($ip_db[0]==$iputente[0]), ($ip_db[1]==$iputente[1] || $ip_db[1]=='*'), ($ip_db[2]==$iputente[2] || $ip_db[2]=='*'), ($ip_db[3]==$iputente[3] || $ip_db[3]=='*')) ); 

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2004
    Messaggi
    376
    eccolo:
    codice:
    array (
      0 => '127',
      1 => '0',
      2 => '0',
      3 => '0',
    )array (
      0 => '127',
      1 => '0',
      2 => '0',
      3 => '1',
    )array (
      0 => true,
      1 => true,
      2 => true,
      3 => false,
    )
    array (
      0 => '127',
      1 => '0',
      2 => '0',
      3 => '1',
    )array (
      0 => '127',
      1 => '0',
      2 => '0',
      3 => '1',
    )array (
      0 => true,
      1 => true,
      2 => true,
      3 => true,
    )
    array (
      0 => '127',
      1 => '0',
      2 => '0',
      3 => '3',
    )array (
      0 => '127',
      1 => '0',
      2 => '0',
      3 => '1',
    )array (
      0 => true,
      1 => true,
      2 => true,
      3 => false,
    )

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    Ok... come vedi i flag sono a posto (potresti eliminare tutti i dump e mettere semplicemente dopo l'if:

    Codice PHP:
    var_export (($ip_db[0]==$iputente[0]) && ($ip_db[1]==$iputente[1] || $ip_db[1]=='*') && ($ip_db[2]==$iputente[2] || $ip_db[2]=='*') && ($ip_db[3]==$iputente[3] || $ip_db[3]=='*')) ; 
    ...avendo quattro "true" dovresti ottenere "true".
    Però non vedo nè "bannato", nè "ok", quindi sembra che il problema sia nell'output, più che nel controllo... metti il dump di cui sopra (aggiungilo ai precedenti) e poi dentro i due rami dell'if metti anche un var_export('...IF true') e var_export('...IF false') rispettivamente

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    (cmq io ho provato e a me funziona, salvo il fatto che ho "simulato" il db con un array statico.

    Ecco l'output (ma si vedono anche "ok" e "bannato"):

    codice:
    P_DB=array (
      0 => '127',
      1 => '0',
      2 => '0',
      3 => '0',
    )
    IPUTENTE=
    array (
      0 => '127',
      1 => '0',
      2 => '0',
      3 => '1',
    )
    true
    true
    true
    false
    ok
    
    
    IP_DB=array (
      0 => '127',
      1 => '0',
      2 => '0',
      3 => '1',
    )
    IPUTENTE=
    array (
      0 => '127',
      1 => '0',
      2 => '0',
      3 => '1',
    )
    true
    true
    true
    true
    bannato
    
    
    IP_DB=array (
      0 => '127',
      1 => '0',
      2 => '0',
      3 => '2',
    )
    IPUTENTE=
    array (
      0 => '127',
      1 => '0',
      2 => '0',
      3 => '1',
    )
    true
    true
    true
    false
    ok

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2004
    Messaggi
    376
    in effetti 4 true vanno bene.
    Io poi faccio questo controllo dopo, magari l'errore è qui, non so:



    Codice PHP:
    if (($ip_db[0]==$iputente[0]) && ($ip_db[1]==$iputente[1] || $ip_db[1]=='*') && ($ip_db[2]==$iputente[2] || $ip_db[2]=='*') && ($ip_db[3]==$iputente[3] || $ip_db[3]=='*')) {  
      
    $ip_trovato=1;
    } else { 
      
    $ip_trovato=0;
     } 
    }

    if (
    $ip_trovato ==1) { 
     
    mysql_query("insert into....")
    } else { 
      echo 
    "ip bannato";
     } 
    e infatti, mi inserisce i record anche quando l'ip è bannato.

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    sì... l'errore è nel controllo... infatti il ciclo va avanti anche dopo che l'ip è trovato e se quindi (come nel tuo esempio) un record del db poi fornisce un risultato negativo, tu memorizzi l'ultimo e quindi $ip_trovato vale 0 (ultimo valore assegnato).

    Se vuoi mantenere il loop senza fermarti fai così:

    $ip_trovato = false; (prima del loop)
    ramo true: $ip_trovato = true;
    ramo false: niente

    infine:

    if ($ip_trovato) { ...

  10. #10
    Utente di HTML.it
    Registrato dal
    Aug 2004
    Messaggi
    376
    Originariamente inviato da eiyen
    sì... l'errore è nel controllo... infatti il ciclo va avanti anche dopo che l'ip è trovato e se quindi (come nel tuo esempio) un record del db poi fornisce un risultato negativo, tu memorizzi l'ultimo e quindi $ip_trovato vale 0 (ultimo valore assegnato).

    Se vuoi mantenere il loop senza fermarti fai così:

    $ip_trovato = false; (prima del loop)
    ramo true: $ip_trovato = true;
    ramo false: niente

    infine:

    if ($ip_trovato) { ...
    ok sembra funzionare! Però ho dovuto cambiare l'ultimo if così;

    if (!$ip_trovato) //se non è true

    Ti trovi?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.