Un buon punto di partenza sull'autenticazione Web di un utente e successiva creazione della sessione a questi relativa può essere il seguente:
<?php
require('db_conn/mysql.php');
if (isset($_POST['user']))
{
$query_login="SELECT * FROM tabella_utenti
WHERE usr='".filtra_caratteri_dannosi($_POST['user'])."'
AND pwd='".md5($_POST['pwd'])."'";
$rslt_login=$mysqlwrapper->Execute($query_login) or die("Errore di autenticazione. ");
if (!$rslt_login->EOF)
{
// Esiste un record con questi username più(firma)password:
// inserisco i dati nella sessione
session_start();
$_SESSION['Username']=$rslt_login->Fields('usr');
$_SESSION['Usergroup']=$rslt_login->Fields('group');
header('location:main.php');
}
else header('location:login_failed.php');
}
?>
<html>
<head>
<title>Esempio login</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body onLoad="document.form1.user.focus()">
<form name="form1" method="POST" action="index.php">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td>Nome utente: </td>
<td><input name="user" type="text" id="user"></td>
</tr>
<tr>
<td>Password: </td>
<td><input name="pwd" type="password" id="pwd"></td>
</tr>
<tr>
<td colspan="2"><input name="Submit" type="submit" value="Entra"></td>
</tr>
</table>
</form>
</body>
</html>
Nel codice si ha un semplice form Web tramite il quale vengono richiesti all'utente username e password. Una volta che questo sia stato compilato, viene richiamata la stessa pagina (con i dati del form in POST vars) ma questa volta viene eseguita la prima parte di essa.
Qui si confrontano username e password inviati con quelli salvati su database. È buona norma non salvare le password in chiaro sul database ma, in loro vece, il loro hash; di qui: confrontiamo nome utente più hash della password. Si veda di seguito per maggiori informazioni.
Se esiste un utente su db con tali username e password, l'utente remoto è autenticato e per esso salviamo via sessione il suo username e (qui come esempio) il suo ipotetico gruppo di appartenenza (per definirne possibili permessi di visualizzazione) e reindirizziamo il flusso della navigazione alla pagina main.php. In caso contrario reindirizziamo alla pagina di errore login_failed.php.
Per ogni nuova pagina (tranne che per login_failed.php), viene fatto il seguente controllo lato server.
<?php
// Controllo accesso
session_start();
if (!isset($_SESSION['Username']))
{
header('location:login_failed.php');
exit;
}
// Il resto dello script
?>
Al fine di controllare se l'utente può visualizzare tale pagina (e quindi abbia precedentemente superato con successo la procedura di log-in), è sufficiente controllare se per esso esiste una sessione - cioè se il SID inviato corrisponde ad un file di sessione su server - verificando che una delle variabili che prima gli avevamo associato esista.
Tramite queste stesse variabili conosciamo anche l'identità dell'utente che sta visualizzando la pagina e possiamo regolarci di conseguenza, a seconda di ciò che la nostra applicazione deve fare.
Secondo questa metodologia, possiamo associare all'utente quante informazioni vogliamo, ma è bene non esagerare per non compromettere inutilmente le prestazioni del sistema.
Sessioni a nudo
Un nome reale di file di sessione (lato server, ricordiamo) è il seguente: sess_89c385f4cfe5f7fc5b5f71ca320d78e9
Un suo possibile contenuto:
Username|s:5:"marco";Usergroup|s:1:"2";
Infine, il cookie (eventuale) che memorizza il SID della sessione (lato client):