Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Login basati su cookie con PHP

Come creare un sistema di accesso in PHP basato sui cookie: dalla creazione del database alla gestione delle password
Come creare un sistema di accesso in PHP basato sui cookie: dalla creazione del database alla gestione delle password
Link copiato negli appunti

La gestione degli accessi, tramite login, è uno degli aspetti fondamentali quando si vuol realizzare un portale web. I punti nodali in cui inserire un sistema di login sono generalmente l'accesso all'area amministrativa del portale e l'accesso da parte degli utenti ad aree riservate del sito. In entrambi i casi bisogna porre molta attenzione alla sicurezza degli accessi.

Per procedere abbiamo bisogno del supporto di un database, per questo esempio ho scelto il MySQL.

Il file con il codice dell'esempio trattato nell'articolo è scaricabile dal link download in alto in questa pagina.

Il database

Il primo passo per la realizzazione di un sistema di login efficace è la creazione di una tabella, nel database, per la gestione degli utenti. Indifferentemente dal tipo di database utilizzato (es. MySQL, MS SQL, ecc.) è importante definire alcuni campi fondamentali per la gestione degli utenti.

Fondamentali sono sicuramente i campi username e password, necessari per l'accesso, ma è anche importante il campo e-mail, necessario sia ai fini della registrazione sia in caso di smarrimento della password. Volendo potremmo fermarci qui, ma per una maggiore sicurezza aggiungeremo altri due campi, stato e codUtente, il primo con lo scopo di distinguere tra utenti attivi e inattivi e l'altro indicherà un codice criptato legato all'utente.

CREATE TABLE IF NOT EXISTS `utenti` (
  `idUtente` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `codUtente` varchar(32) NOT NULL,
  `username` varchar(30) NOT NULL,
  `password` varchar(32) NOT NULL,
  `email` varchar(50) NOT NULL,
  `stato` int(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`idUtente`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

Sopra lo script MySQL necessario a creare la tabella utenti.

La sicurezza del login

È importantissimo offrire ai nostri utenti un sistema di login sicuro, il che significa criptare la password a livello del database, gestire i cookie (o eventualmente le sessioni) con un codice identificativo dell'utente, anch'esso criptato. Obbligare gli utenti a inserire password lunghe almeno otto caratteri serve a rendere più complicato il furto dell'account.

Nello specifico, è importante criptare la password a livello di database, al fine di non permettere, neanche a chi può accedere al database, di leggere i dati d'accesso di un utente, a tal fine consiglio di utilizzare la funzione PHP md5($string) che restituisce un valore criptato a 32 bit non reversibile, ma con risultato fisso, il che significa che se passiamo il valore "casa" all'interno della funzione md5 quest'ultima restituirà sempre lo stesso valore criptato (202447d5d44ce12531f7207cb33b6bf7).

Un altro campo da criptare è codUtente, che procederemo sempre tramite la funzione md5, passando come valore l'indirizzo e-mail considerandolo come univoco e legato al singolo account.

Passiamo, nella prossima pagina, alla programmazione PHP.

Registrazione di un nuovo utente

Immaginiamo che l'utente sia giunto sul nostro sito per la prima volta e voglia accedere a una sezione riservata del sito. Come prima cosa dovrà procedere alla registrazione di un nuovo account. Nel nostro esempio la registrazione richiedere l'inserimento di un username, di una password e di un indirizzo e-mail valido, ma possiamo richiedere all'utente anche molte altre informazioni.

Nell'esempio ho utilizzato anche uno script JavaScript che al momento della registrazione verifica che l'utente abbia compilato correttamente tutti i campi.

Al momento dell'invio dei dati per la registrazione lo script JS verifica che tutti i campi siano compilati, dopo di che invia i dati allo script PHP che procedere alla memorizzazione nel database. Prima della memorizzazione dobbiamo effettuare, prima di tutto, la verifica che l'e-mail usata sia nuova e non legata a un account già attivo, in tal caso restituisce un errore. Nel caso l'e-mail sia nuova, dobbiamo criptare la password e creare il codUtente.

$codUtente = md5($_POST["email"]);
$codPassword = md5($_POST["password"]);
$Sql = "INSERT INTO `utenti` SET `username`='".@$_POST["username"]."', `codUtente`='".$codUtente."', `password`='".$codPassword."', `email`='".@$_POST["email"]."';";

Le poche righe riportate sopra mostrano come ho criptato la password $codPassword = md5($_POST["password"]); e come ho creato il codUtente $codUtente = md5($_POST["email"]);.

Quando procediamo alla registrazione, il database MySQL assegna, di default, 0 al campo stato, questo valore indica che l'account è registrato ma non è attivo, quindi i dati di accesso non permettono di eseguire il login con successo.

Dopo aver registrato l'account, lo script PHP crea e invia un'e-mail all'utente che contiene i dati di accesso (username e password) e riporta anche un link di attivazione dell'account. Questo link richiama una funzione che attiva l'account, cambiando il valore del campo stato da 0 ad 1.

$Sql = "UPDATE `utenti` SET `stato` = '1' WHERE `codUtente`='".@$_POST["cod"]."' LIMIT 1 ;";
$Query = mysql_query($Sql);
header('Location: index.php');

Questo cambio di valore permette di impostare l'account come attivo e quindi abilitato all'accesso all'area riservata.

Effettuare il login

Come di norma chiederemo al nostro utente di inserire username e password per effettuare il login.

$codPassword = md5($_POST["password"]);
$Sql = "SELECT * FROM `utenti` WHERE `username`='".@$_POST["username"]."' AND `password`='".$codPassword."' AND `stato`='1';";
$Query = mysql_query($Sql);
if(mysql_num_rows($Query) == 1)
      {
            $Dati = mysql_fetch_array($Query);
            if(@$_POST["ricorda"] == 1)
                  $TempoDiValidita = 2592000;  //Cookie attivo per 30 giorni
            else
                  $TempoDiValidita = 72000; //Cookie attivo per 2 ore
            SettaCookie($Dati["codUtente"], $TempoDiValidita);
            header('Location: home.php');
      }
else
      {
            header('Location: index.php');
      }

Il codice riportato sopra mostra la procedura di verifica del login, come primo passo dobbiamo criptare la password digitata per poterla confrontare con quella nel database. Secondo passo la query SQL che verifica nel database l'esistenza di un account legato all'username e alla password indicati. Da notare che questa query contiene anche una verifica dello stato dell'account, per accettare il login solo dagli account attivati (stato=1).

Una volta verificato che nome utente e password appartengono a un account attivo dobbiamo assegnare un cookie con i dati dell'utente.

function SettaCookie($ID_UTENTE, $TEMPO)
      {
            setcookie('LOGIN', $ID_UTENTE, time()+$TEMPO); // Identifica l'utente
      }

Alla funzione SettaCookie passiamo due valori, il primo è il codice identificativo dell'utente e il secondo è il tempo di validità del cookie.

Il cookie che abbiamo creato permette all'utente di accedere nuovamente alla sezione riservata anche in un secondo momento, ovviamente nel tempo di validità del cookie.

È importante, a questo punto, ricordarsi di fornire all'utente anche la possibilità di eseguire il logout. Dato che utilizziamo i cookie per la gestione degli accessi, la procedura di logout deve intervenire anche su di loro. Per cancellare un cookie è sufficiente impostare il suo tempo di vita a -1 (SettaCoockie(" ", -1);).

Ho smarrito la password

L'ultimo aspetto da prendere in considerazione è legato all'eventualità che l'utente smarrisca i dati di accesso all'area riservata. A tal fine è fondamentale il campo e-mail, che come valore legato unicamente a un unico account ci permetterà di recuperare i dati smarriti dall'utente.

function PasswordRandom()
      {
            $PASSWORD = "";
            mt_srand(crea_seme());
            for($i=0; $i<8; $i++)
                  {
                        $PASSWORD .= "".mt_rand(0, 9)."";
                  }
            return $PASSWORD;
      } 
$Sql = "SELECT * FROM `utenti` WHERE `email`='".@$_POST["email"]."' AND `stato`='1';";
$Query = mysql_query($Sql);
if(mysql_num_rows($Query) == 1)
      {
				$Dati = mysql_fetch_array($Query);
				$Password = PasswordRandom();
				$Sql = "UPDATE `utenti` SET `password` = '".md5($Password)."' WHERE `codUtente`='".$Dati["codUtente"]."' LIMIT 1 ;";
				$Query = mysql_query($Sql);
				$Messaggio = "
					Buongiorno ".$Dati["username"].",n
					questa e-mail ti giunge dall'area riservata del sito ".NOMESITO.".nn
					Di seguito trovi il dati di accesso all'area riservata del sito.nn
					Username: ".$Dati["username"].",n
					Password: ".$Password.",nnn
					In caso di problemi ti inviatiamo a contattarci direttamente.";
				mail($_POST["email"], "NOMESITO - Recupero Password", $Messaggio);
				header('Location: index.php?act=RecuperoOn');
      }
else
      {
				header('Location: index.php?act=RecuperoOff');
      }

Lo script sopra, mostra una semplice procedura di recupero dei dati d’accesso. In primo luogo una query SQL estrarrà dal database i dati dell’account corrispondente all’e-mail digitata, ma solo nel caso che l’account risulti attivato.

Dato che la password è criptata non possiamo dare all’utente il codice criptato della sua password, in quanto è inutilizzabile, quindi procediamo a creare e registrare una nuova password casuale (nel nostro caso una password numerica di 8 cifre), che registreremo ed invieremo all’utente il quale poi procederà a cambiarla.

Al termine è inviato un messaggio e-mail contenente i dati per l’accesso all’area riservata.

Ti consigliamo anche