Mi sono preso una brutta sloggatura

Il controllo dell'accesso ad una parte o ad un intero sito web è una problematica estremamente comune. L'esigenza nasce soprattutto quando all'utente viene consentito l'accesso in scrittura e aggiornamento dei dati contenuti nel database su cui si poggia il sito, ma anche quando l'accesso è soltanto in consultazione le problematiche legate alla privacy impongono che soltanto chi è autorizzato possa accedere a determinate informazioni.

Ne deriva che all'interno di alcune o di tutte le pagine di un sito nasca la necessità di effettuare il controllo se l'utente abbia o meno effettuato la procedura di accesso (in gergo chiamata login). L'informazione login_effettuato_sì_no viene valorizzata nella pagina di login, che acquisisce username e password, li passa ad una pagina di validazione e registra che l'utente sta dentro. Se i siti fossero costituiti da un'unica pagina saremmo a cavallo, ma per fortuna all'interno di un sito si naviga da una pagina all'altra e non possiamo certo richiedere all'utente di validarsi daccapo ogni volta che cambia pagina. Le variabili lato server hanno un tempo di vita che nasce e muore con la pagina; vengono quindi perse ogni volta che si entra in una pagina nuova. Né è possibile percorrere la strada di passare lo stato di login come parametro con il metodo get o post, perché in tal caso sarebbe facilissimo per chiunque salvarsi l'url prelevandolo dalla cronologia del browser ed entrare nell'area protetta senza passare dalla dogana.

Per ovviare a questi inconvenienti, ci vengono incontro le variabili di sessione, che sono variabili speciali che hanno la caratteristica di essere persistenti all'interno di una sessione, che di solito si estende alla navigazione di n pagine.

In PHP, la sessione viene aperta con il primo richiamo della funzione session_start. La stessa funzione session_start, richiamata successivamente, non cambia sessione, ma ci consente di accedere alle variabili ad essa associate. Tali variabili sono contenute nell'array speciale $_SESSION. Una variabile di sessione di nome var potrà essere utilizzata in lettura o scrittura referenziandola come $_SESSION['var']. Eventualmente la variabile può essere singolarmente cancellata usando la funzione unset. Al termine della sessione bisogna chiamare la funzione session_destroy, che cancella tutte le variabili di sessione esistenti e chiude logicamente la sessione corrente.

Vediamo praticamente come questi concetti si applicano ai nostri siti web.

La generica pagina alla quale si può accedere soltanto loggandosi incomincia con questo controllo:
<?php
session_start();
if (!isset($_SESSION['logged'])){
 header ("Location: ./login.php");
 exit ();
}
$user=$_SESSION['user'];
?>

Vediamo che se non si è logged si viene redirezionati alla pagina di login, dove saranno richiesti il nickname e la password, dati che saranno sottoposti alla pagina di validazione, che incomincia così:
<?php
session_start ();
$user=$_POST['user'];
$password=$_POST['password'];
$connessione = mysql_connect("localhost", "root", "")
or die("Connessione non riuscita: " . mysql_error());
mysql_select_db("mydatabase",$connessione);
$sql="select nickname, password from tutenti where tutenti.nickname='$user';";
$risul=mysql_query($sql);
if ($risul==FALSE) die("Query non valida: " . mysql_error());
$n=mysql_num_rows($risul);
if ($n != 0) {
 $riga=mysql_fetch_row($risul);
 if (crypt($password, "chiave di crypt da me scelta per il sito") == $riga[1]) {
  $_SESSION['logged'] = 1;
  $_SESSION['user'] = $user;
 }
}
mysql_close($connessione);
header ("Location: ./index.php");
exit();
?>

Se ci fate caso la pagina di validazione redirige alla home page sia se ha dato l'ok sia nel caso di esito negativo. Sarà l'home page che se ancora non è stato effettuato il logout si comporterà riproponendo la pagina di login.

Se, leggendo le variabili di sessione, le pagine del sito verificano che l'utente è dentro, proporranno un collegamento ipertestuale con la pagina di logout, che incomincia così:
<?php
session_start();
session_destroy();
header("Location: ./index.php");
exit();
?>

Commenti

  1. http://nettuts.com/videos/screencasts/how-to-build-a-login-system-for-a-simple-website/

    RispondiElimina
  2. E' Consigliato criptare la Psw con la Crypt ma con la Crittografia SHA1.

    RispondiElimina
    Risposte
    1. Approfondimenti sui vari metodi di crittografia disponibili in PHP in questo articolo.

      Elimina

Posta un commento

Post più popolari