Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    Limitare Il N.ro Di Tentativi Di Accesso

    Ecco. La mia prima pillola! (notturna, oltretutto)


    Prima di tutto dovete configurare il vostro databse, ecco la query:

    Codice PHP:
    CREATE TABLE `IP_LOG` (
      `
    IPtext NOT NULL,
      `
    TRYint(11NOT NULL default '0',
      `
    TIMEbigint(20NOT NULL default '0'
    ENGINE=MyISAM DEFAULT CHARSET=latin1


    Allora, una volta creata la tabella, create un file no_brute_thanks.php:

    Codice PHP:
    <?php
    //**************************************************//
    //    Author: Kappaloris                                //
    //    Email:     [email]kappaloris@gmail.com[/email]                    //
    //                                                    //
    //  Special Thanks: socci4                            //
    //**************************************************//
    function NO_BRUTE_INC() {
    require 
    'no_brute_conf.php';
    $ip getenv('REMOTE_ADDR');
    //connessione al db e scelta tabella
    $mc mysql_connect($host,$usr,$pwd);
    $db1 mysql_select_db($db);
    //lettura dei campi IP, TRY e TIME
    $query "SELECT IP,TRY,TIME FROM IP_LOG WHERE IP = '$ip'";
    $risultato mysql_query($query);
    //fissaggio dei dati ad altrettante variabili
    $dati mysql_fetch_array($risultato);
    list( 
    $ipl$TRY$TIME) = $dati;
    //se l'ip è già stato loggato
    if ($ip == $ipl) {
    //tempo trascorso dall'ultima visita
     
    $gap time() - $TIME;

            
    //se il numero di tentativi è inferiore o uguale a 12 e il tempo trascorso è inferiore ai 15 min incrementa di 1 il n di tentativi
            
    if($TRY<=12 && $gap 900){
                
    $TRY++;
                
    $query "UPDATE IP_LOG SET TRY = '$TRY' WHERE IP = '$ip'";
                
    $query_exec mysql_query($query);
                
    mysql_close($mc);
                exit;
                
    //se il tempo trascorso è superiore o uguale ai 15 min azzera il contatore
            
    } elseif($gap >= 900) {
                
    $time_now time();
                
    $query "UPDATE IP_LOG SET TRY =0 , TIME = '$time_now'  WHERE IP = '$ip'";
                
    $query_execmysql_query($query);
                
    mysql_close($mc);
                exit;
            }
            
    //se l'ip non è ancora stato loggato 
        
    }else{
            
    $time_now time();
            
    $query "INSERT INTO IP_LOG(IP,TRY,TIME) VALUES('$ip','1','$time_now')";
            
    $query_exec mysql_query($query);
            
    mysql_close($mc);
            exit;
        }
        
    //pulizia degli ip ormai in disuso da più di 7gg
    $max_log_time time() - 604800;
    $query "DELETE FROM IP_LOG IP,TRY,TIME WHERE TIME < '$max_log_time'";
    $query_exec mysql_query($query);
    mysql_close($mc);
    exit;
    }

    function 
    NO_BRUTE_CHECK() {
    require 
    'no_brute_conf.php';
    $ip getenv('REMOTE_ADDR');
    //connessione al db e scelta tabella
    $mc mysql_connect($host,$usr,$pwd);
    $db1 mysql_select_db($db);
    //lettura dei campi IP, TRY e TIME
    $query "SELECT IP,TRY,TIME FROM IP_LOG WHERE IP = '$ip'";
    $risultato mysql_query($query);
    //fissaggio dei dati ad altrettante variabili
    $dati mysql_fetch_array($risultato);
    list( 
    $ipl$TRY$TIME) = $dati;
    //se l'ip è già stato loggato
    if ($ip == $ipl) {
    //tempo trascorso dall'ultima visita
     
    $gap time() - $TIME;
     
    //se il numero di tentativi è superiore a 12 e il tempo trascorso è inferiore ai 15 min blocca l'esecuzione
        
    if( $TRY >12 && $gap 900) {
            
    mysql_close($mc);
            return 
    FALSE;
             exit;
                
        }else{
        return 
    TRUE;
            }
        
    //pulizia degli ip ormai in disuso da più di 7gg
    $max_log_time time() - 604800;
    $query "DELETE FROM IP_LOG IP,TRY,TIME WHERE TIME < '$max_log_time'";
    $query_exec mysql_query($query);
    mysql_close($mc);
    exit;
        }

    }

    ?>
    E lo salvare in una cartella con il suo file di configurazione:
    Codice PHP:
    <?php
    //****************************************
    //            **CONFIGURAZIONE**
    //****************************************
    $host 'TUO HOST (es. localhost)';
    $usr 'TUO USERNAME PER IL LOGIN';
    $pwd 'TUA PASSWORD ';
    $db 'DATABASE SCELTO';
    //****************************************
    ?>
    Ovviamente opportunatamente modificato.

    FILE DISPONIBILI PER IL DOWNLOAD DIRETTO
    ->> QUI <<-

    FUNZIONAMENTO DELLE FUNZIONI:
    NO_BRUTE_CHECK() controlla che l'utente non abbia già esurito i tentativi.
    Ritorna TRUE se l'utente non li ha esauriti e FALSE se l'utente ha già sparato tutte le cartucce.

    NO_BRUTE_INC() incrementa il numero di tentativi utilizzati.

    Da come l'ho configurato io ogni utente può tentare (e fallire) di loggarsi 11 volte nell'arco di 15 min. Passati 15 minuti dal primo dei tentativi, il numero di tentativi utilizzati viene portato a 1.
    E, ad ogni chiamata dello script, controlla se ci sono nella tabella dei record più vecchi di una settimana, e, se li trova, li elimina. (così il db non si appesantisce).
    (più altre cose che non stò qui a spiegarvi)

    Poi, nella pagina da voi scelta, mettete:
    Codice PHP:
    include 'no_brute_thanks.php'
    Se lo avete salvato nella stessa cartella.
    Altrimenti, se, per esempio, lo avete salvato il lib/ allora mettete:
    Codice PHP:
    include 'lib/no_brute_thanks.php'
    Poi (ovviamente DOPO aver messo l' include) fate, nel punto in cui vi interessa una chiamata a NO_BRUTE_CHECK() per controllare che l'utente non abbia già sparato tutte le sue cartucce. E NO_BRUTE_INC() per incrementare il valore del numero di tentativi usato.

    ESEMPI DI UTILIZZI:

    Una pagina di login dove volete limitare il numero di tentativi per loggarsi:
    Codice PHP:
    -- PAGINA CON IL FORM PER IL LOGIN--
    if (
    NO_BRUTE_CHECK()) {

    //  METTETE IL FORM, DATO CHE L'UTENTE NON
    //  HA SPRECATO TUTTE LE SUE POSSIBILITA' 
      
      
    NO_BRUTE_INC();

    } else {
    echo 
    " HAHAHAHA Ci hai provato bello!";

    Quindi, nel caso in cui il login fallisce, il sistema registrerà l' ip ed aumenterà il numero di tentativi usati, bloccandolo se eccede.


    Altro esempio:

    Nello -strano- caso in cui si voglia limitare il numero di accessi per una pagina:

    Codice PHP:

    if (NO_BRUTE_CHECK()) {

    //
    //             PAGINA OK
    //

    NO_BRUTE_INC();
    } else {

    //
    //           PAGINA DI ERRORE
    //


    Beh, credo che questo sia tutto, se avete comande sarò felice di rispondervi.

  2. #2
    scusami se mi permetto, ma ci sono svariati errori:
    - la tabella contiene 2 campi, su 3, strutturati male: l'ip può avere una dimensione massima di 15 caratteri, ma di solito conviene conservarlo nella sua forma numerica, ovvero di un INT mentre l'ultimo campo, il time, dovrebbe diventare un INT dato che penso che lo script non verrà usato per più di qualche centinaio d'anni di fila ed in questo modo consuma il doppio dello spazio stressando tremendamente il processore per le operazioni. Inoltre facendo in questo modo la tabella diventerebbe di tipo FIXED aumentando TREMENDAMENTE le performance

    - nella tabella manca una chiave primaria, qualcosa di essenziale, che potrebbe benissimo essere il campo TIME o il campo IP

    - il codice avvia una nuova connessione ... sarebbe molto meglio verificare se c'è ne una attiva ed usare quella in modo evitare carico inutile

    - getenv e qualche migliaio di volte più lento dell'utilizzo diretto della variabile $_SERVER, sotto stress è sconsigliato usarlo

    - i parametri di controllo sono hard-coded, anche se è facile cambiarli non tutti ne sono capaci, metterli esterni sarebbe una cosa molto buona

    - l'eliminazione automatica a 7 giorni la eliminerei o comunque la aumenterei a tipo 1 mese o di più

    - nella tabella aggiungerei un sicuramente 2/3 campi, ovvero l'url corrente, i parametri spediti in POST (quelli get sono già presenti nella url) ed infine i COOKIE.

    - convertirei le query di controllo usando il COUNT dato che a te non interessa avere effettivamente il contenuto ma solo il conteggio

    - infine, per renderlo più sicuro, aggiungere un flag per indicare la riuscita, o meno, del login, in modo da fargli stabilire se è riuscito o meno l'operazione, e che se quindi deve incrementare o resettare il contatore, in base a questa informazione

    per il resto non ho altro da dire

  3. #3
    Originariamente inviato da daniele_dll
    per il resto non ho altro da dire
    quale resto?

    Ehhh, mi spiace, ma io non è che sono poi così bravo (pensa che il mio cammino nel php è iniziato circa 3 settimane fa con 0% esperienza e una copia di PHP5 & MySql della MacGraw Hill...)

    Comunque, se pensi che ne valga la pena (e se ne hai tempo/volgia) aggiungi (anzi direi riscrivi da capo a questo punto) quello che manca.


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.