Link copiato negli appunti
La procedura di autenticazione per il back-end del piccolo blog engine d'esempio si articolerà in tre fasi:
- inserimento in un modulo dei dati richiesti per l'autenticazione (username e password);
- confronto tra i dati inviati dal modulo e il contenuto della tabella richiamata in query;
- esito del confronto: in caso positivo (i dati inviati tramite il modulo corrispondono a quelli memorizzati in tabella) si avrà accesso all'amministrazione, diversamente sarà eseguita una procedura di rindirizzamento verso la homepage del sito.
Di seguito viene presentato il codice necessario per il login, compreso di form per l'invio dei dati di autenticazione, i commenti aiuteranno nella comprensione dei diversi passaggi ma verranno fornite successivamente ulteriori informazioni sul suo funzionamento:
<?php // inizializzazione della sessione session_start(); // se la sessione di autenticazione // è già impostata non sarà necessario effettuare il login // e il browser verrà reindirizzato alla pagina di scrittura dei post if (isset($_SESSION['login'])) { // reindirizzamento alla homepage in caso di login mancato header("Location: gestisci.php"); } // controllo sul parametro d'invio if(isset($_POST['submit']) && (trim($_POST['submit']) == "Login")) { // controllo sui parametri di autenticazione inviati if( !isset($_POST['username']) || $_POST['username']=="" ) { echo "Attenzione, inserire la username."; } elseif( !isset($_POST['password']) || $_POST['password'] =="") { echo "Attenzione, inserire la password."; }else{ // validazione dei parametri tramite filtro per le stringhe $username = trim(filter_var($_POST['username'], FILTER_SANITIZE_STRING)); $password = trim(filter_var($_POST['password'], FILTER_SANITIZE_STRING)); $password = sha1($password); // inclusione del file della classe include "funzioni_mysql.php"; // istanza della classe $data = new MysqlClass(); // chiamata alla funzione di connessione $data->connetti(); // interrogazione della tabella $auth = $data->query("SELECT id_login FROM login WHERE username_login = '$username' AND password_login = '$password'"); // controllo sul risultato dell'interrogazione if(mysql_num_rows($auth)==0) { // reindirizzamento alla homepage in caso di insuccesso header("Location: index.php"); }else{ // chiamata alla funzione per l'estrazione dei dati $res = $data->estrai($auth); // creazione del valore di sessione $_SESSION['login'] = $res-> id_login; // disconnessione da MySQL $data->disconnetti(); // reindirizzamento alla pagina di amministrazione in caso di successo header("Location: gestisci.php"); } } }else{ // form per l'autenticazione ?> <h1>Accesso all'amministrazione:</h1> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST"> Username:<br /> <input name="username" type="text"><br /> Password:<br /> <input name="password" type="password" size="20"><br /> <input name="submit" type="submit" value="Login"> </form> <? } ?>
Commentando il funzionamento del codice proposto è possibile fornire la seguente descrizione:
- viene lanciata una sessione che sarà aperta solo nel caso in cui il processo di autenticazione dovesse avere successo;
- viene effettuato un controllo sull'invio dei dati tramite modulo, se uno dei due campi di input non dovesse essere formulato si riceverà una notifica relativa all'omissione;
- nel caso siano stati inviati tutti e due i parametri richiesti, questi verranno passati alla funzione
filter_var()
che grazie all'argomento FILTER_SANITIZE_STRING permetterà di filtrare gli input evitando stringhe potenzialmente pericolose per l'applicazione e i dati da essa gestiti; - la query di selezione consiste nell'estrazione del valore relativo al campo denominato "username_login" (
SELECT username_login
) dove i parametri di input sono identici ai valori memorizzati nei campi "username_login" e "password_login" (WHERE username_login = '$username' AND password_login = '$password'
); l'operatore di confronto AND consente di introdurre un nuovo criterio di selezione oltre quello già proposto tramite WHERE, essa restituisce TRUE soltanto nel caso in cui entrambi i confronti effettuati producano un risultato positivo. mysql_num_rows()
è una funzione nativa di PHP che ha il compito di restituire il numero di righe coinvolte da un risultato per le istruzioni SELECT, accetta come parametro l'esito della query passata amysql_query()
e può essere utilizzata per procedure di controllo; nel caso del codice proposto, per esempio, il numero di righe coinvolte dall'interrogazione non potrà essere uguale a "0", diversamente l'esito del confronto tra gli input inviati e il contenuto della tabella sarebbe negativo e l'autenticazione non avrebbe luogo.- Se il controllo effettuato da
mysql_num_rows()
dovesse restituire "0" allora il login fallirebbe e il browser dell'utente subirà una rindirizzamento alla homepage del blog. - Nel caso di esito positivo verrà invece richiamata la funzione
estrai()
che estrarrà dalla tabella il valore relativo al campo "id_login" e lo utilizzerà per creare un valore di sessione che permetterà di accedere alle altre pagine dell'amministrazione. - Il successo della procedura di login determinerà una rindirizzamento alla pagina gestisci.php in cui sarà presente il modulo per l'inserimento dei post.