Creazione del data base
La registrazione degli account degli utenti in un data base deve evitare la scrittura in chiaro della password e deve
consentire di recuperare la password quando viene dimenticata.
In una versione semplificata si crea un database dove verranno memorizzati solo i campi username e password, successivamente si prenderanno in considerazione altre esigenze e si individueranno gli altri campi necessari.
In una finestra dos, posizionarsi nella cartella contenente il server MySql, oppure richiamare "mysql console" per creare il data base:
myql> create database Utenti; Accesso al database: mysql> use Utenti; Creazione tabella: mysql > CREATE TABLE users ( - > ID MEDIUMINT NOT NULL AUTO_INCREMENT PRIMARY KEY, - > username VARCHAR(60), - > password VARCHAR(60) );
Problema:
Scrivere una pagina web che consenta le seguenti operazioni:
Pagina di registrazione di un utente.
nome del file: Registrazione.php
<?php mysql_connect("localhost", "root", "") or die(mysql_error());Si avvia una connessione a mysql. Si noti che non viene acquisito il valore di ritorno, che rappresenta l'identificativo della connessione. Comunque se l'operazione di connessione da un esito negativo lo script viene interrotto e viene segnalato il motivo dell'errore.
mysql_select_db("Utenti") or die(mysql_error());Si seleziona il data base Utenti. Qualora ciò non fosse possibile lo script viene interrotto e viene segnalato il motivo dell'errore.
if (isset($_POST['invio'])) {L'accesso alla pagina è subordinato all'esistenza della variabile invio disponibile nell'array $_POST solo se l'utente è arrivato in questa pagina attraverso il form di registrazione.
if (!$_POST['utente'] | !$_POST['pw1'] | !$_POST['pw2'] ) { die('non hai inserito tutti i campi'); }Se l'utente ha lasciato almeno un campo vuoto lo script viene interrotto e ne viene segnalato il motivo.
$nomeUt = $_POST['utente']; $esito = mysql_query("SELECT username FROM users WHERE username = '$nomeUt'") or die(mysql_error());viene acquisito il nome che l'utente ha inserito nella casella di testo Utente e si interroga il data base estraendo dalla tabella users tutti campi username aventi tale valore. Se l'operazione non riesce viene segnalato un errore.
$esistente = mysql_num_rows($esito); if ($esistente != 0) { die('Spiacente il nome scelto '.$_POST['utente'].' è già assegnato.'); }la funzione mysql_num_rows restituisce il numero di righe restituite dall'interrogazione del data base. Lo script termina se si trova che lo stesso nome è stato scelto già da un altro utente
if ($_POST['pw1'] != $_POST['pw2']) { die('le due password sono diverse.'); }Infine, prima di registrare l'account dell'utente ci si assicura che le due password inserite siano uguali.
$_POST['pw1'] = md5($_POST['pw1']);A questo punto sono stati superati tutti i controlli, si passa a criptare la password mediante la funzione md5
$insert = "INSERT INTO users (username, password) VALUES ('".$_POST['utente']."', '".$_POST['pw1']."')"; $nuovoUtente = mysql_query($insert); ?>Le credenziali dell'utente vengono registrate nel data base.
<h1>Registrato</h1> <p>adesso, autenticandoti, puoi accedere all'area riservata</p> <?php } else {Se l'utente è giunto in questa pagina senza compilare il form, scrivendo direttamente l'indirizzo gli viene proposto il modulo di registrazione.
?> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> <table border="0"> <tr><td>nome Utente:</td><td> <input type="text" name="utente" maxlength="60"> </td> </tr> <tr><td>Password:</td><td> <input type="password" name="pw1" maxlength="10"> </td></tr> <tr><td>Conferma la Password:</td><td> <input type="password" name="pw2" maxlength="10"> </td></tr> <tr><th colspan=2><input type="submit" name="invio" value="Registrami"> </th></tr> </table> </form> <?php } ?>
Verifica dell'autorizzazione
Dopo essersi registrato, un utente può accedere all'area riservata tramite un form che richiede l'inserimento del nome utente e della password:
nome del file: Login.php
<?php mysql_connect("localhost", "root", "") or die(mysql_error());Viene avviata una connessione al server mysql. Se l'operazione non riesce viene mostrato un messaggio di errore.
mysql_select_db("utenti") or die(mysql_error());Viene selezionato il data base contenente gli account degli utenti.
if(isset($_COOKIE['Autenticato'])) { $username = $_COOKIE['Autenticato']; $pass = $_COOKIE['Riconosciuto'];L'utente che è entrato in questa pagina dopo aver compilato il form di Login ha inviato anche due cookie: quello denominato «Autenticato» contiene il nome utente, mentre quello denominato «Riconosciuto» contiene la password. Se il client ha spedito questi cookie, da essi, vengono lette le credenziali: nome utente e password.
$esito = mysql_query("SELECT * FROM users WHERE username = '$username'") or die(mysql_error());Si interroga il data base per ottenere il record corrispondente all'utente autenticato. Nella variabile $esito c'è il risultato della query
while($info = mysql_fetch_array( $esito )) { if ($pass != $info['password']) { } else { header("Location: privato.php"); } }La variabile $esito è una tabella temporanea contenente tutti i record che soddisfano la condizione di ricerca. La funzione mysql_fetch_array preleva una riga della tabella e la deposita nella variabile $info, che in tal modo diventa un array associativo i cui indici sono i nomi dei campi della tabella. Da questo array associativo si preleva il campo password. Se questa password non corrisponde a quella fornita si ripropone il modulo di login, altrimenti si redireziona il browser del client alla pagina privato.php, ovvero all'area riservata.
}Termine della sezione eseguita se l'utente ha inviato il cookieif (isset($_POST['invio'])) { if(!$_POST['username'] | !$_POST['pass']) { die('completa tutti i campi.'); }Se la richiesta è pervenuta da un form si verifica se sono stati compilati i campi nome utente e password.
$esito = mysql_query("SELECT * FROM users WHERE username = '" . $_POST['username']."'") or die(mysql_error()); $esistente = mysql_num_rows($esito);con i due campi "nome utente" e "password" si interroga il data base per prelevare il record che soddisfa il requisito di ricerca. La funzione mysql_num_rows restituisce il numero di righe della tabella temporanea ottenuta dalla query.
if ($esistente == 0) { die('il nome utente non esiste nel nostro archivio.'); echo('<a href="Registrazione.php">registrati</a>'); }Se il numero di righe ottenuto è zero significa che non esiste nessun record associato all'utente.
while($info = mysql_fetch_array($esito )) { $_POST['pass'] = stripslashes($_POST['pass']); $info['password'] = stripslashes($info['password']); $_POST['pass'] = md5($_POST['pass']); if ($_POST['pass'] != $info['password']) { die('password errata, ripeti.');Altrimenti si verifica se la codifica md5 della password corrisponde a quella letta dal data base. Se non corrisponde si interrompe lo script.
} else {se l'autenticazione è riconosciuta si invia un cookie$_POST['username'] = stripslashes($_POST['username']); $durata = time() + 3600; setcookie('Autenticato', $_POST['username'], $durata); setcookie('Riconosciuto', $_POST['pass'], $durata);e l'utente viene reindirizzato nell'area riservata. Durante questo reindirizzamento il client oltre ad inviare la richiesta della pagina, invia anche il cookieheader("Location: privato.php"); } }
} else {se si è giunti in questa pagina scrivendo l'indirizzo nella barra del browser, cercando di raggirare il controllo, viene inviato il form di login al client.?> <form action="<?php echo $_SERVER['PHP_SELF']?>" method="post"> <table border="0"> <tr><td colspan=2><h1>Login</h1></td></tr> <tr><td>Username:</td><td> <input type="text" name="username" maxlength="40"> </td></tr> <tr><td>Password:</td><td> <input type="password" name="pass" maxlength="50"> </td></tr> <tr><td colspan="2" align="right"> <input type="submit" name="invio" value="Login"> </td></tr> </table> </form> <?php } ?>
Area Riservata
nome del file: privato.php
<?php mysql_connect("localhost", "root", "") or die(mysql_error());Connessione a MySqlmysql_select_db("utenti") or die(mysql_error());Selezione della tabellaif(isset($_COOKIE['Autenticato'])) { $username = $_COOKIE['Autenticato']; $pass = $_COOKIE['Riconosciuto'];Controllo della presenza dei cookie. se ci sono vengono letti i valori che essi contengono: Utente e Password.$esito = mysql_query("SELECT * FROM users WHERE username = '$username'") or die(mysql_error());interrogazione del data base con i dati contenuti nei cookie.while($info = mysql_fetch_array( $esito )) { if ($pass != $info['password']) { header("Location: login.php");Se la password nel cookie è differente da quella contenuta nel data base l'utente viene inviato alla apgina di autenticazione.} else { echo "<p>Area di amministrazione</p>"; echo "<p>Elenco operazioni </p>"; echo "<a href=logout.php>Logout</a>"; }Altrimenti viene consentito l'accesso, presentando una pagina contenente un menu.} } else { header("Location: login.php"); }Se i cookie non vengono ricevuti l'utente viene reindirizzato alla pagina di autenticazione. ?>
Uscita
Uscita dall'Area Riservata
Logout.php. <?php $durata = time() - 100; setcookie('Autenticato', 'finito', $durata); setcookie('Riconosciuto', 'finito', $durata); header("Location: login.php"); ?>Si imposta la scadenza del cookie e si ritorna alla pagina di autenticazione.