Pagina di registrazione utente

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
    }
    ?>

Pagina di autenticazione utente

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 cookie
if (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 cookie
header("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 } ?>

Accesso all'area riservata

Area Riservata

nome del file: privato.php

<?php mysql_connect("localhost", "root", "") or die(mysql_error());
Connessione a MySql
mysql_select_db("utenti") or die(mysql_error());
Selezione della tabella
if(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.