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.