Autenticazione in PHP. Negli script di amministrazione o di accesso a servizi riservati, è assolutamente necessario una procedura di autenticazione con Login e Password (autenticazione in base a cosa si sa). Una procedura di autenticazione deve salvare lo stato utente ricordando il login effettuato. Risulta quindi indispensabile la gestione di sessioni ed il loro rilascio in fase di logout. In questa lezione vedremo come implementare delle funzioni per l autenticazione in PHP. La tabella MySQL di supporto La struttura della tabella è la seguente : CREATE TABLE Users ( user_id VARCHAR(40) NOT NULL PRIMARY KEY, username VARCHAR(40) NOT NULL UNIQUE, password VARCHAR(40) NOT NULL ) Il campo aggiuntivo user_id è una stringa univoca. Essa viene creata in fase di registrazione del utente. In questo modo è possibile effettuare i controlli soltanto su di essa, senza portare avanti le informazioni accoppiate username e password. L informazione user_id sarà contenuta in una variabile di sessione registrata ($uid). Nella sezione riservata, verrà effettuato un controllo su tale variabile. Se non è settata, significa che un utente non autenticato tenta di accedere alla pagina protetta. In fase di log out, si effettua il rilascio della sessione e il reset della variabile $uid. La struttura dello script Per implementare i nostri script di autenticazione, ci basiamo su una libreria di funzioni per la registrazione, il login e la visualizzazione del form di registrazione/autenticazione. I file che fanno parte del nostro sistema di log in sono : auth.php registrazione.php login.php pagina.php La libreria di funzioni Lo script di registrazione Lo script di autenticazione La pagina protetta pagina.php Mostriamo prima di tutto il file pagina.php. Esso è una pagina di contenuto protetto che deve essere visualizzato soltanto dagli utenti loggati : /* una pagina riservata*/ if (isset($uid)) { <HTML><HEAD><TITLE>Pagina Riservata</TITLE></HEAD> <BODY><H2>Bravo! sei autenticato</h2>
La struttura dello script <br> <a href="login.php?action=out">log Out</a><br> </BODY> //non sei autenticato // contenuto non protetto <HTML><HEAD><TITLE>Pagina Riservata</TITLE></HEAD> <BODY><H2>Effettua il login o registrati!</h2> <br> <a href="login.php?action=in">log In</a><br> <a href="registrazione.php">registrati</a><br> </BODY> Osservate come viene protetta la pagina semplicemente osservando lo stato della variabile di sessione $uid. Se essa non è settata, viene visualizzato un messaggio di errore ed i link che portano al file di login (lo script che effettua il login ed il logout è lo stesso; si specifica l action in una querystring) ed a quello di registrazione. login.php Questo script si occupa dell autenticazione e del logout. Il codice è il seguente : /* script di login Autore : Domenico Nappo */ include("auth.php"); if ($REQUEST_METHOD!='POST') { if ((isset($uid))&&($action=='in')) { //sei già autenticato echo 'Sei stato autenticato con successo elseif ((isset($uid))&& ($action=='out')){ session_unset(); session_destroy(); echo "<H2>Arrivederci.</H2><br> <a href='login.php?action=in'> Log In</a>"; form_login('login'); $msg=login($username,$password,&$uid); if ($msg=='') { echo 'Sei stato autenticato con successo
form_login('login',$msg); Se si chiama lo script con una querystring action=out, significa che si vuole effettuare il logout. In questo caso, si rilascia la sessione e si saluta l utente, mostrando il link a login.php (questa volta con action=in) per effettuare un nuovo login. Se l action è in, si visualizza il form per l autenticazione. La funzione che si utilizza per il form di autenticazione e di registrazione è la stessa: essa discrimina se si tratta di un login o di una registrazione per un nuovo utente grazie al parametro $action che le viene passato come primo argomento. Vedremo meglio il suo semplice funzionamento quando parleremo delle funzioni presenti nella nostra libreria auth.php. Tornando allo script login.php, se il metodo con cui è stato richiamato lo script è POST, vuol dire che si è già visualizzato il form di autenticazione e adesso si cerca di loggarsi. Lo script richiama la funzione login(), a cui vengono passati i parametri $username e $password e restituisce un messaggio $msg, da cui si valuta il successo dell operazione. Se $msg è vuoto, non c è stato alcun errore, altrimenti viene richiamata la funzione form_login() esplicitando l argomento opzionale che indica l errore di autenticazione. Alla funzione login() viene passato per riferimento la variabile $uid, in modo che il suo cambiamento all interno dela funzione sia visibile anche all esterno di essa e possa così essere registrata correttamente dalla funzione session_register(). registrazione.php Questo script si occupa della registrazione degli utenti. Utilizza anch esso delle funzioni contenute nella libreria auth.php. /* Script di registrazione Autore: Domenico Nappo */ include ("auth.php"); if ($REQUEST_METHOD=='POST') { $msg=registra($username,$password,&$uid); if ($msg=='') { echo 'Sei stato registrato con successo form_login('registrazione',$msg); form_login('registrazione'); La struttura di questo script è davvero molto semplice: se si è chiamato lo script da un modulo HTML, significa che si sta tentando una registrazione. A questo scopo, si effettua una chiamata alla funzione registra(), a cui vengono passati gli argomenti $username e $password
La struttura dello script (provenienti dal modulo HTML), oltre alla variabile di sessione passata per riferimento. Il controllo sul successo dell operazione (che potrebbe fallire nel caso ci sia un utente registrato con la stessa username scelta da chi ha richiesto la registrazione attuale) viene effettuato allo stesso modo del login, cioè sulla variabile $msg. Se c è un errore (la variabile $msg non è vuota), si visualizza il form di registrazione con relativo messaggio di errore tramite l istruzione: form_login('registrazione',$msg); Se invece non si proviene dal modulo di registrazione, si visualizza quest ultimo. auth.php Questa libreria è il cuore del nostro sistema di script di autenticazione. Esaminiamo un blocco alla volta : function form_login($action,$msg=' ') { $action1=$action.'.php'; echo " <HTML><HEAD><TITLE>$action</TITLE></HEAD> <BODY><FORM action='$action1' method='post'> <TABLE border='1' align='center'><tr><td colspan=2> Form di $action <TR><TD>Username :</TD> <TD><INPUT type='text' name='username' size='10' maxlength='10'> <TR><TD>Password :</TD> <TD><INPUT type='password' name='password' size='10' maxlength='10'> <TR><TD colspan=2> $msg <TR><TD colspan=2> <INPUT type='submit' value='$action'> </TABLE></FORM></BODY></HTML>"; La funzione form_login() visualizza un modulo che, a seconda dell action, risulta puntare allo script di registrazione o di login, impostandola, all atto della chiamata, proprio come il nome del file a cui si vuol far puntare lo script. Il messaggio di errore è vuoto per default. function registra($usr,$passwd,&$uid) { include("corso.inc.php"); $conn=connect($host,$user,$pass,$db); $query="select * FROM Users WHERE username='$usr'"; $res=mysql_query($query,$conn) or die(mysql_error()); if (mysql_num_rows($res)==0) { $passwd=md5($passwd); $uid=md5(uniqid(rand())); $query_ok="insert INTO Users VALUES('$uid','$usr','$passwd')"; mysql_query($query_ok,$conn); $msg=''; mysql_close($conn); $msg='user_id già presente. Sceglierne un altro';
Questa funzione viene richiamata per la registrazione dell utente. Si controlla prima se nel database è già presente la username scelta (in questo caso il messaggio di errore ritornato non è vuoto). Se non è presente, si cripta la password con la funzione md5() e si genera un userid con una combinazione md5(), uniqueid() e rand(), per far in modo che l userid generato sia univoco (anche se c è un piccolo margine di probabilità che questo non accada). I dati così ottenuti vengono inseriti nel database e la funzione ritorna la variabile $msg come vuota, per indicare il successo dell operazione. Inoltre, la variabile $uid, passata per riferimento, all uscita della funzione sarà automaticamente registrata come variabile di sessione. function login($usr,$passwd,&$uid) { include("corso.inc.php"); $conn=connect($host,$user,$pass,$db); $passwd=md5($passwd); $query="select * FROM Users WHERE username='$usr' AND password='$passwd'"; $res=mysql_query($query,$conn); if (mysql_num_rows($res)!=0) { $row=mysql_fetch_row($res); $msg=''; $uid=$row[0]; mysql_close($conn); $msg='username o password errata.riprovare'; Questo è l ultimo blocco della nostra libreria e consiste nella funzione login(). La sua interfaccia e la sua logica di funzionamento è simile a quella della funzione registra(), ma in questo caso ci limitiamo soltanto a verificare la presenza della coppia username-password proveniente dal form di login. Se tale coppia è presente nel nostro database di utenti, allora poniamo $uid pari al campo corrispondente presente nel record prelevato. Tale variabile viene così registrata, garantendo l accesso alla pagina protetta pagina.php. Se non ci sono righe presenti, si ottiene un errore e si ritorna un messaggio di errore senza settare la variabile $uid, rendendo impossibile l accesso all area riservata agli utenti autenticati. Questa interessante lezione (spero pensiate lo stesso anche voi!) è terminata. Nella prossima si parlerà di uno degli aspetti che caratterizzano la programmazione web professionale : il templating.?2002 By Domenico Nappo, Domenico Surace e Manuali.net L autore declina ogni responsabilità per eventuali (quanto improbabili) danni recati al sistema per l uso degli script di esempio riportati in questa guida.