Salve,
Ho sviluppato un metodo per l'area riservata di un sito a modo mio e vorrei sapere può essere abbastanza efficace.
Prima spiego che il concetto base è quello di creare un metodo simile a quello che viane fatto quando ad una persona, dopo la verifica dell'identità, si lascia un pass magnetico che gli permette di accedere liberamente all'interno di un complesso... ecc.
Nel sito si accede all'area riservata tramite un solo file che verifica la correttezza dell'user e la password:
Ad ogni tentativo viene rigenerata la variabile di sessione, non spiego il motivo per non scrivere troppo; dopo 30 tentativi sbagliati non si potrà più provare ad entrare perché bypasserà la verifica e darà sempre il risultato di user o password non corretti, almeno che non si chiude il browser e poi lo si riapre ecc..
Una volta che il controllo dei dati di login corrispondono genera un record in una tebella separata da quella che contiene i dati per l'accesso all'area riservata e vi memorizza:
- l'id di sessione
- L'username
- Il valore non criptato della password che ha autogenerato lo script (valida solo per la sessione)
- l'ivello dell'amministratore e il suo id record della tabella per il login
- Data inizio login in valore intero tramite time()
Poi genero le variabili di sessione con user, password (valida solo per la sessione) e altre cose secondarie, che servono per navigare liberamente nell'area riservata dato che una volta fatto il login ad ogni pagina dovranno corrispondere all'interrogazione del database:
- id di sessione che si utilizza
- user e valore criptato della password memorizzata nella sessione.
Poi cancella qualsiasi record della tabella che al valore data login tramite time() supera le 25 ore in modo da ripulirla da tutti i login precedenti esauriti e ai qualli non si è fato il logout; ad ogni operazione e cambio pagina nell'area riservata questa data viene sempre riaggiornata
Inoltre tutto avviene nella stessa pagina form e controllo dei dati senza nessun redirectory; in caso di refresh che può rigenerare l'accesso ho messo un campo nascosto che si prende i valorimicrotime che poi verranno memorizzati in un campo della tabella login, e se questi sono uguali o inferiori bypassa il controllo e da esito negativo.
Questi sono gli script:
Codice PHP:
// ----------------------------------->LOGIN
if(!isset($_SESSION['username'])){$username = trim($_POST['username']);}
if(!isset($_SESSION['password'])){$password = trim($_POST['password']);}
$login = trim($_POST['login']);
if(isset($_POST['checkLogin'])){
$checkLogin_X = explode(' ',$_POST['checkLogin']);
$checkLogin = "id_microtime-( ".$checkLogin_X[2].$checkLogin_X[1]." )"; unset($checkLogin_X);
}
if($login && $username && $password && $admin_condition != "ACCESSO-VALIDO"){
if(!isset($_SESSION['admin_condition'])){
$tentativi = $_SESSION['tentativi'] + 1;
session_regenerate_id();
$_SESSION['tentativi'] = $tentativi;
}
if($tentativi < 30){
$password = crypt($password, substr($password, 0,3));
ereg('[a-zA-Z0-9àòèéùìç @\*\$\#\£\€\+\=_\-]{6,25}',$username,$posix);
$username = $posix[0];
$query = "SELECT * FROM `admin` WHERE id!='' and user='$username' and password ='$password' and note_php != '$checkLogin'";
$res = mysql_query($query); $num = mysql_num_rows($res);
}
else{ $num = 0; }
if($num>0){
$_SESSION['tentativi'] = 0;
while($riga = mysql_fetch_array($res)){
$data_admin = $riga['data'];
$id_admin = $riga['id'];
$livello_admin = $riga['livello'];
$sql_checkLogin = $riga['note_php'];
}
// evita di rifare il login con un refresh o ritorno alla pagina...
if(substr($sql_checkLogin,0,14) == 'id_microtime-('){
if($sql_checkLogin > $checkLogin){$num =0;}
}
if($num>0){
$query = "UPDATE admin SET note_php = '".$checkLogin."' WHERE id = '".$id_admin."'";
$res = mysql_query($query); $num = mysql_affected_rows();
// fine evita di rifare il ...
$view_date = explode('-', $data_admin);
$data_admin = $view_date[2]."/".$view_date[1]."/".$view_date[0];
$loginPassword = generatePassword();
$password = crypt($loginPassword, substr($loginPassword, 0,3));
//---*
$sec = time(); $sec = $sec-((60*60)*25);//25 ore
$query = "DELETE FROM `admin_login` WHERE (`id_admin` = '".$id_admin."' AND `last_update` < '".$sec."') OR `last_update` =''".
" OR `last_update` IS NULL";
mysql_query($query);
$num = mysql_affected_rows();
//---*
$query = "INSERT INTO `admin_login` (`id` , `id_session` , `password` , `id_admin` , `last_update` , `note` , `note_php`)".
"VALUES (NULL , '".session_id()."' , '".$password."' , '".$id_admin."', '".time()."' , '".$livello_admin."' , NULL)";
mysql_query($query);
$num = mysql_affected_rows();
if($num>0){
$messages[] = "Login avvenuto con successo.";
$admin_condition = "ACCESSO-VALIDO"; $_SESSION['admin_condition'] = $admin_condition; //formula per attivare password.
$_SESSION['username'] = $username;
$_SESSION['password'] = $loginPassword;
$_SESSION['id_admin'] = $id_admin;
$_SESSION['data_admin'] = $data_admin;
}
else{$messages[] = " - Attenzione! Problema interno nella verifica del login. Contattare il webmaster.";}
}
}
}
Poi in qualsiasi pagina:
Codice PHP:
//CONTROLLO PERMESSI ---------------------------------------->
if(
$admin_condition == "ACCESSO-VALIDO" &&
IsSet($_SESSION['username']) &&
IsSet($_SESSION['password']) &&
IsSet($_SESSION['data_admin']) &&
IsSet($_SESSION['id_admin'])
){
$db_password = crypt($password, substr($password, 0,3));
$query = "SELECT * FROM `admin_login` WHERE password ='$db_password' and id_admin='$id_admin' and id_session ='".
session_id()."'";
$res = mysql_query($query); $num = mysql_num_rows($res);
if($num>0){
while($riga = mysql_fetch_array($res)){$livello_admin = $riga['note'];}
$queryPsw = crypt($password, substr($password, 0,3));
$query = "UPDATE admin_login SET last_update ='".time()."' WHERE `id_session` = '".session_id().
"' AND `password` = '".$queryPsw."' AND `id_admin` = '".$id_admin."' ";
$res = mysql_query($query);
}
else {unset($admin_condition); unset($_SESSION['admin_condition']);}
}
// fine controllo permessi.
Per il logout da qualsiasi pagina link a quella del login e:
Codice PHP:
//LOGOUT----------------------------------------------------->
if($logout){
if($admin_condition && $db && $id_admin){
$queryPsw = crypt($password, substr($password, 0,3));
$query = "DELETE FROM admin_login WHERE `id_session` = '".session_id()."' AND `password` = '".$queryPsw.
"' AND `id_admin` = '".$id_admin."' ";
$res = mysql_query($query);
}
unset($_SESSION['admin_condition']);
unset($admin_condition, $username, $password, $data_admin, $id_admin);
session_destroy(); // Distruzione dati sessione su disco server.
$_SESSION = array(); // Distruzione Array super globale session.
setcookie(session_name(), '', time() - 3600); // Cancellare i cookie di sessione.
}
Il tallone di achille di questo sistema è che se si riescie ad intercettare la sessione si potrebbe accedere nell'area riservata con gli stessi permessi finché lasessione è valida.
Esempio pratico: http://www.creazione-web.it/siti-esempio.php