4E e 4I SIA: Cos’è una sessione e come si utilizza - esempi
Cos’è una sessione e come si utilizza
Una sessione è un meccanismo che permette di conservare informazioni e stato dell'utente tra diverse pagine web durante una singola visita. Poiché il protocollo HTTP è stateless (privo di memoria tra una richiesta e l'altra), le sessioni consentono al server web di riconoscere un client specifico mentre naviga nel sito.
Come funziona una sessione
Inizializzazione e ID: Quando la sessione viene avviata, PHP genera un identificatore unico e casuale chiamato Session ID (es. c28a8d11e0f854...).
Inoltro al Client: Il server invia questo ID al browser dell'utente, che lo memorizza sotto forma di cookie HTTP (di default chiamato PHPSESSID).
Memorizzazione dei Dati: I dati reali della sessione vengono salvati sul server (in file temporanei sul disco, in memoria RAM con Redis/Memcached o in un database).
Richieste Successive: Ad ogni nuova pagina visitata, il browser invia automaticamente il cookie con il Session ID. PHP legge questo ID, recupera i dati associati sul server e popola la variabile superglobale $_SESSION.
Come si utilizzano le sessioni in PHP
Tutte le operazioni si effettuano tramite la superglobale $_SESSION.
1. Avviare la sessione (session_start)
session_start() deve essere invocata all'inizio di ogni script PHP in cui si intende usare la sessione, prima di inviare qualsiasi output HTML o spazio bianco al browser.
<?php
// Avvia una nuova sessione o riprende quella esistente
session_start();
?>
2. Salvare e modificare dati
I dati vengono assegnati alla variabile $_SESSION come in un normale array associativo:
<?php
session_start();
$_SESSION['user_id'] = 42;
$_SESSION['username'] = 'Mario';
$_SESSION['role'] = 'admin';
?>
3. Leggere i dati
Prima di leggere un dato è buona norma verificarne l'esistenza con isset() o empty():
<?php
session_start();
if (isset($_SESSION['username'])) {
echo "Bentornato, " . htmlspecialchars($_SESSION['username']);
} else {
echo "Utente non autenticato.";
}
?>
4. Distruggere e pulire i dati
Per gestire il logout o resettare lo stato:
<?php
session_start();
// Rimuove una singola variabile
unset($_SESSION['username']);
// Svuota l'intero array di sessione
$_SESSION = array();
// Distrugge i dati della sessione salvati sul server
session_destroy();
?>
Esempio Pratico: Flusso di Login e Logout
1. login.php (Autenticazione)
<?php
session_start();
// Simulazione di autenticazione riuscite
$_SESSION['user_id'] = 10;
$_SESSION['username'] = 'Laura';
// Rigenera l'ID di sessione per sicurezza dopo l'autenticazione
session_regenerate_id(true);
header('Location: dashboard.php');
exit;
2. dashboard.php (Area Protetta)
<?php
session_start();
// Controllo accesso
if (!isset($_SESSION['user_id'])) {
header('Location: login.php');
exit;
}
echo "Benvenuto nella dashboard, " . htmlspecialchars($_SESSION['username']);
?>
3. logout.php (Chiusura Sessione)
<?php
session_start();
// 1. Svuota l'array $_SESSION
$_SESSION = array();
// 2. Elimina il cookie di sessione nel browser
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(
session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
// 3. Distrugge la sessione sul server
session_destroy();
header('Location: login.php');
exit;
Sicurezza e Best Practices
session_regenerate_id(true): Invocare questo metodo subito dopo il login previene gli attacchi di Session Fixation (fissazione della sessione).
Flag sui Cookie: Configurare i parametri dei cookie prima di session_start() per impedire l'accesso JavaScript (XSS) e forzare l'invio protetto:
session_set_cookie_params([
'lifetime' => 0,
'path' => '/',
'domain' => '',
'secure' => true, // Invia solo su HTTPS
'httponly' => true, // Inaccessibile via JavaScript (protegge da XSS)
'samesite' => 'Lax' // Aiuta a proteggere da attacchi CSRF
]);
session_start();
Cookie vs Sessioni: I cookie risiedono sul dispositivo dell'utente e sono modificabili dall'utente stesso; le sessioni risiedono sul server, risultando idonee alla memorizzazione di dati sensibili (come credenziali, ruoli e permessi).
Esercizio semplice (completo) con le sessioni e Php
1. login.php
PHP
<?php
// 1. Avvia la sessione (deve essere in cima a ogni file che usa le sessioni)
session_start();
// 2. Se l'utente è già loggato, lo manda direttamente alla pagina riservata
if (isset($_SESSION['logged_in']) && $_SESSION['logged_in'] === true) {
header('Location: dashboard.php');
exit;
}
// 3. Credenziali fisse salvate in variabili (senza database)
$username_corretto = "admin";
$password_corretta = "12345";
$errore = "";
// 4. Controllo quando il modulo (form) viene inviato
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// Recupera i dati inviati dal form
$username_inserito = $_POST['username'] ?? '';
$password_inserita = $_POST['password'] ?? '';
// 5. CONTROLLO USERNAME E PASSWORD
if ($username_inserito === $username_corretto && $password_inserita === $password_corretta) {
// Se corretti: crea le variabili di sessione
$_SESSION['logged_in'] = true;
$_SESSION['username'] = $username_inserito;
// Reindirizza alla pagina protetta
header('Location: dashboard.php');
exit;
} else {
// Se errati: imposta il messaggio di errore
$errore = "Username o password errati!";
}
}
?>
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<title>Login Semplice</title>
</head>
<body>
<h2>Pagina di Login</h2>
<!-- Mostra l'errore se le credenziali non sono corrette -->
<?php if (!empty($errore)): ?>
<p style="color: red;"><?php echo $errore; ?></p>
<?php endif; ?>
<!-- Form di login -->
<form action="login.php" method="POST">
<div>
<label for="username">Username:</label><br>
<input type="text" id="username" name="username" required>
</div>
<br>
<div>
<label for="password">Password:</label><br>
<input type="password" id="password" name="password" required>
</div>
<br>
<button type="submit">Accedi</button>
</form>
<p><small>Credenziali di prova: <strong>admin</strong> / <strong>12345</strong></small></p>
</body>
</html>
2. dashboard.php
PHP
<?php
// 1. Avvia la sessione
session_start();
// 2. CONTROLLO ACCESSO: Se non esiste la sessione o non è true, blocca l'utente
if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) {
// Reindirizza al login chi cerca di accedere direttamente dall'URL
header('Location: login.php');
exit;
}
?>
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<title>Area Riservata</title>
</head>
<body>
<!-- Saluta l'utente recuperando il nome salvato nella sessione -->
<h1>Benvenuto, <?php echo htmlspecialchars($_SESSION['username']); ?>!</h1>
<p>Hai effettuato l'accesso con successo. Questa è la pagina protetta.</p>
<!-- Link per disconnettersi -->
<p><a href="logout.php">Disconnetti (Logout)</a></p>
</body>
</html>
3. logout.php
PHP
<?php
// 1. Avvia la sessione per poter accedere ai dati da distruggere
session_start();
// 2. Svuota tutte le variabili salvate in sessione
session_unset();
// 3. Distrugge completamente la sessione
session_destroy();
// 4. Riporta l'utente alla pagina di login
header('Location: login.php');
exit;
Flusso di funzionamento
login.php riceve admin e 12345.
Se i dati corrispondono, scrive $_SESSION['logged_in'] = true nella memoria del server e reindirizza su dashboard.php.
dashboard.php controlla l'esistenza di $_SESSION['logged_in']. Se assente o falsa, rimanda l'utente a login.php.
logout.php cancella la sessione e riporta al login.

Commenti
Posta un commento