PHP

LOGIN

Progettazione e implementazione di un sistema di autenticazione sicuro. Il modulo copre la gestione delle sessioni PHP, l'hashing delle password con algoritmi moderni e l'integrazione con database MySQL tramite PDO.

Durata

300 minuti

Software

XAMPP (Apache, MySQL), VS Code o Sublime Text, Browser Web

Parte 1: Fondamenti Teorici del Sistema di Autenticazione

L'autenticazione è il processo mediante il quale un sistema informatico verifica l'identità di un utente. In un'applicazione web basata su stack LAMP (Linux, Apache, MySQL, PHP), questo processo si articola in tre fasi fondamentali:

Fase Descrizione Tecnologia utilizzata
Identificazione L'utente invia le proprie credenziali (username e password) tramite un form HTML. HTML5 Method="POST"
Verifica Il server confronta le credenziali ricevute con quelle memorizzate nel database. PHP & PDO (prepared statements)
Persistenza Una volta verificato, il server "ricorda" l'utente per le pagine successive. PHP $_SESSION

La Sicurezza: Hashing e SQL Injection

Non è mai accettabile memorizzare le password in testo in chiaro. In caso di accesso non autorizzato al database, tutte le credenziali verrebbero compromesse. Utilizzeremo la funzione password_hash() per creare un hash univoco e password_verify() per il confronto. Inoltre, per prevenire attacchi di tipo SQL Injection, utilizzeremo i Prepared Statements tramite l'interfaccia PDO di PHP, separando la logica della query dai dati inseriti dall'utente.

Il Ciclo di Vita della Sessione

Poiché l'HTTP è un protocollo stateless (senza memoria), PHP utilizza le sessioni per mantenere lo stato.

  • session_start(): Inizializza o riprende una sessione esistente.
  • $_SESSION['user_id']: Array superglobale per memorizzare dati persistenti.
  • session_destroy(): Elimina i dati della sessione (Logout).

LABORATORIO

Sviluppo Sistema Login Area Riservata

Realizzazione di un modulo di accesso per un portale aziendale di gestione documentale.


1 Configurazione Database e Struttura

Aprite phpMyAdmin e create un database chiamato gestione_scuola. Eseguite il seguente codice SQL per creare la tabella utenti:


CREATE TABLE utenti (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    email VARCHAR(100)
);

-- Inserimento di un utente di test (password: 12345)
-- Nota: Nella realtà useremo un form di registrazione
INSERT INTO utenti (username, password) VALUES 
('admin', '$2y$10$e0MYzXyjpJS7Pd0RVvHwHeasLz3X65mP5C6OpxZp9/O58Wp.m8vS.');

2 Connessione al Database (db.php)

Create un file per gestire la connessione centralizzata utilizzando PDO.


<?php
$host = "localhost";
$db_name = "gestione_scuola";
$username = "root";
$password = "";

try {
    $pdo = new PDO("mysql:host=$host;dbname=$db_name", $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    die("Errore di connessione: " . $e->getMessage());
}
?>

3 Elaborazione del Login (login.php)

Questo script riceve i dati dal form e verifica l'utente.


<?php
session_start();
require "db.php";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $user = $_POST['username'];
    $pass = $_POST['password'];

    $sql = "SELECT * FROM utenti WHERE username = :username";
    $stmt = $pdo->prepare($sql);
    $stmt->execute(['username' => $user]);
    $utente = $stmt->fetch();

    if ($utente && password_verify($pass, $utente['password'])) {
        $_SESSION['user_id'] = $utente['id'];
        $_SESSION['username'] = $utente['username'];
        header("Location: area_riservata.php");
    } else {
        echo "Credenziali non valide.";
    }
}
?>

<form method="POST">
    Username: <input type="text" name="username" required><br>
    Password: <input type="password" name="password" required><br>
    <button type="submit">Accedi</button>
</form>

4 Area Protetta e Logout (area_riservata.php)

Ogni pagina riservata deve controllare se la sessione è attiva.


<?php
session_start();
if (!isset($_SESSION['user_id'])) {
    header("Location: login.php");
    exit;
}
?>
<h1>Benvenuto nell'area riservata, <?php echo $_SESSION['username']; ?>!</h1>
<p>Contenuto segreto aziendale...</p>
<a href="logout.php">Effettua il Logout</a>

5 Esercizio di Realtà (Esercitazione Autonoma)

Scenario: Il cliente "Biblioteca Comunale" richiede che, dopo il login, il sistema mostri anche la data e l'ora dell'ultimo accesso dell'utente.

  • Task 1: Modifica la tabella utenti aggiungendo un campo ultimo_accesso di tipo DATETIME.
  • Task 2: Nel file login.php, dopo la verifica corretta della password, esegui una query di UPDATE per salvare il timestamp attuale nel database per quell'utente.
  • Task 3: Visualizza la data dell'ultimo accesso nella pagina area_riservata.php prelevandola dal database.





PHP, MySQL, Login, Sessioni, Sicurezza, Hashing, PDO,