L'autenticazione degli utenti è una delle condizioni più importanti per rendere interattivo un sito web. Se gli utenti sono anonimi, ovvero le sessioni sono gestite tutte allo stesso modo, sarà difficile offrire dati, informazioni o funzionalità personalizzate su base utente.

Abbiamo già visto l'uso degli algoritmi di criptazione per memorizzare in modo sicuro le password degli utenti sul database: vediamo adesso come gestire il login degli utenti a livello web, considerando come esempio un ipotetico sito web realizzato in PHP sul server Apache.

Inclusione delle risorse sensibili

Solitamente i programmatori PHP definiscono i dati di connessione al database in un unico file, per poterli editare in un solo punto qualora cambiasse la stringa di connessione. Questo file ha spesso nome database.php o connect.php (o qualcosa del genere). La prima precauzione da prendere è evitare che un utente “intuisca” questo pattern e si connetta al database abusivamente, ad esempio scrivendo nel browser qualcosa del genere

http://dominio.com/sito/common/database.php

Un modo molto semplice di ridurre i rischi è quello di definire una costante nell'header delle nostre pagine, ad esempio

define('INCLUDE_CHECK',true);

e controllare, in testa ai file sensibili (quelli da includere) che la costante sia stata dichiarata

if (!defined('INCLUDE_CHECK')) die('Do not even think about that!');

siccome la prudenza non è mai troppa, è buona norma aggiungere questo controllo anche nelle pagine dove mettiamo le eventuali funzioni o librerie.

Autenticazione e sessione HTTP

L'autenticazione, in breve, è il processo che permette di associare una sessione HTTP con l'ID del nostro utente. Siccome ogni utente, anche se anonimo, naviga sul nostro sito con la propria sessione HTTP, dal momento in cui associamo l'ID della sessione ad un certo utente potremo identificarlo fino al termine del collegamento. E' quindi di fondamentale importanza impostare in modo opportuno la durata della sessione, come spiegato qui.

Per autenticare l'utente dovremo:

  1. Verificare che username e password inseriti dall'utente coincidano con quelli memorizzati sul nostro server, di solito all'interno del database. Una guida per capire come svolgere quest'operazione è disponibile qui
  2. Se il controllo va a buon fine, una pratica comune è scrivere l'ID dell'utente, così com'è stato recuperato dal database, all'interno di una variabile di sessione, ad esempio

// Se l'utente è stato riconosciuto nel DB

if ($row['login']) {

$_SESSION['user'] = $row['login'];

$_SESSION['id'] = $row['codice'];

}

dove $row è l'array associativo che contiene i risultati della query nella tabella degli utenti. Nell'esempio qui sopra abbiamo ipotizzato che le colonne del database abbiano nome login e codice, mentre per le corrispondenti variabili di sessione abbiamo scelto i nomi user e id.

E' importante non fare confusione tra l'ID della sessione HTTP, che di solito è scritto all'interno di un cookie inviato al client, con l'ID dell'utente memorizzato come variabile della sessione. E' vero che ad ogni ID di sessione, dopo il login, corrisponderà un unico ID dell'utente, ma tra i due vi è una grande differenza. L'ID della sessione sarà in genere diverso di volta in volta, e verrà cambiato se la sessione scade o viene rinnovata. L'ID dell'utente è fissato dalle tabelle nel database e di solito non cambia mai, a meno che non siamo costretti a riorganizzare il database (cosa che capita molto raramente).

Nota: se vogliamo ficcare il naso nella gestione delle sessioni HTTP possiamo dare un'occhiata al file php.ini nella nostra installazione di Apache. Ad esempio, se usiamo easyPHP potremmo avere qualcosa del genere:

session.save_path = "C:\Program Files (x86)\EasyPHP-5.3.8/tmp"

che ci indica il path dove sono memorizzati i files delle sessioni. Di solito però non dobbiamo occuparci di toccare questa directory, ci pensano Apache e PHP a gestirla per noi.

Verifica dell'autenticazione

L'ultima cosa da fare è inserire un controllo in ogni pagina del sito, e verificare che l'utente sia autenticato prima di visualizzare la pagina richiesta. Questo controllo ovviamente non va inserito nelle pagine pubbliche, cioè quelle che vogliamo mostrare anche ai visitatori occasionali. Ricordiamoci che tra le pagine pubbliche ci saranno sempre le pagine dedicate alla registrazione e autenticazione degli utenti, altrimenti l'utente non autenticato non avrebbe modo di raggiungerle: mettere la verifica dell'autenticazione nella pagina di login sarebbe come mettere la serratura del portone solo verso l'interno dell'edificio.

Il controllo può essere molto semplice, ad esempio

if ($_SESSION['id'])

echo '<h1>Ciao, '.$_SESSION['user'].'! Bentornato!</h1>' ;

else echo '<h1>Effettua il <a href="login.php">login</a>.</h1>' ;

Chiaramente non ci limiteremo a visualizzare solo un messaggio (come qui sopra), ma se l'utente non è autenticato provvederemo ad inoltrarlo verso una pagina di cortesia, dove potrà inserire username e password (la pagina di login).

Funzionalità avanzate

Abbiamo visto i concetti base dell'autenticazione in PHP. Gli esempi qui sopra ci mettono in grado di autenticare gli utenti, usando i dati memorizzati nel database. Quello che manca è la procedura per creare gli account dell'utente, ovvero una pagina di registrazione, che generalmente si aggiunge in un secondo tempo. All'inizio possiamo creare gli account direttamente sul database, ad esempio usando phpMyAdmin, e poi comunicare le credenziali agli utenti. Vedremo come aggiungere un pagina di registrazione nelle prossime puntate.

L'altra funzionalità spesso presente è la casellina ricordami, che risparmia all'utente l'onere di inserire login e password ad ogni visita. Per capire come funziona ci sarà utile conoscere meglio il meccanismo dei cookies, altro argomento che approfondiremo molto presto.