59 DBMS 5 – reindirizzamento e sessioni
creiamo una nuova pagina main.php e modifichiamo la elogin1.php nella parte dove l’utente si è autenticato:
if ($autenticato) echo "Ok, superato il check" . $nl ; else echo "Autenticazione fallita" . $nl ;
in
if ($autenticato) header("Location: main.php"); else header("Location: dbms_form1.php");
se l’utente è autenticato carica la pagina main.php, altrimenti ributta al login.
Il comando header è il reindirizzamento ad un altra pagina.
Prima di tutto bisogna capire se la pagina main.php è stata invocata dalla nostra elogin1.php o se qualcuno avesse digitato direttamente l’indirizzo nel browser. Il tipico funzionamento web è state less cioè senza stato (in questo caso di memoria), una pagina non ricorda se è stata richiamata da un altra. Un meccanismo per ovviare a ciò sono le sessioni. Ora vediamo un meccanismo semplice, più avanti ci preoccuperemo della sicurezza. Ogni visitatore che arriva per la prima volta su un sito, gli viene associato al suo browser un id, l’id di sessione, ed ogni volta che naviga da una pagina all’altra l’id viene memorizzato che potrà essere intercettato da php fino a che la sessione del visitatore non distrugge la sessione. Per accedere all’ambiente di sessione è necessario inizializzarlo all’inizio delle pagine php (elogin1.php e main.php) con il comando:
session_start();
se si vuole sapere l’id di sessione attuale, basta usare la funzione session_id. Ricordiamoci di commentare l’if else del comando header per fare questa prova
echo session_id();
Adesso $comandoSQL aggiungiamo anche il recupero dell’id utente dal database (la chiave primaria)
$comandoSQL = "select iduser, psw from users where email ='" . $email ."'";
aggiungiamo, prima del riderect, subito dopo if($autenticato), una riga che assegna l’id utente preso dal database uguale all’id della sessione di quell’utente.
$_SESSION['iduser']=$riga['iduser'];
si è scelto il nome dell’indice iduser di $_SESSION uguale a quello del campo del database per praticità, anche se non era obbligatorio.
Adesso aggiungiamo a main.php il controllo se è settato l’iduser di $_SESSION:
session_start(); if (!isset($_SESSION['iduser']) ) header("Location: dbms_form1.php");
se non è settato rimandami al login. Visto che se chiudiamo e riapriamo il browser la sessione rimane in cache, per un lavoro più accurato e sicuro alla fine del main.php dissociamo la chiave di $_SESSION e distruggiamo la sessione con queste 2 funzioni:
<?php session_unset(); session_destroy(); ?>
Così se anche si chiude il browser e dopo averlo riaperto si richiama direttamente main.php, verremmo reindirizzati direttamente al login.
ecco il codice del main.php
<?php session_start(); if (!isset($_SESSION['iduser']) ) header("Location: dbms_form1.php"); ?> <!DOCTYPE html> <html> <head> <title>Untitled</title> </head> <body> Benvenuto! <?php session_unset(); session_destroy(); ?>
e quello di elogin1.php, dove ho rimosso ogni parte html perchè inutile e dannosa
<?php session_start(); //echo session_id(); $nl="<br />"; //recuperiamo le credenziali di accesso $accessData=parse_ini_file('../../../confagtest.ini'); // Un controllo per sicurezza if ($_SERVER['REQUEST_METHOD'] =='POST') { // Si la pagina è stata davvero richiamata dalla form //recupero il contenuto della textbox email $email = $_POST['email']; // e della textbox password $psw = $_POST['password']; //Vediamo se il bottone è premuto if(isset($_POST['btnAccedi'])) { $comandoSQL = "select iduser, psw from users where email ='" . $email ."'"; //echo $comandoSQL; //connessione $conn = mysqli_connect("localhost",$accessData['username'],$accessData['password']); if($conn) echo "Connessione riuscita".$nl; //selezionare il database mysqli_select_db($conn, $accessData['dbname']); //inviare il comando SQL $risultato = mysqli_query($conn, $comandoSQL); //confronto le psw if ($riga = mysqli_fetch_assoc($risultato) ) { echo "Trovato" . $nl; $autenticato = ($psw === $riga['psw']); } else $autenticato = false; // chiudere la connessione mysqli_close($conn); //redirect if ($autenticato) { $_SESSION['iduser']=$riga['iduser']; header("Location: main.php"); } else header("Location: dbms_form1.php"); } else { echo "Hai premuto nuovo utente"; } } ?>