Ecco. La mia prima pillola! (notturna, oltretutto)
Prima di tutto dovete configurare il vostro databse, ecco la query:
Codice PHP:
CREATE TABLE `IP_LOG` (
`IP` text NOT NULL,
`TRY` int(11) NOT NULL default '0',
`TIME` bigint(20) NOT 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_exec= mysql_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.