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

Post popolari in questo blog

Esercizi in Excel e fogli di Google

Simulazioni di reti (con Cisco Packet Tracer)