- Scegliere dispositivi e strumenti in base alle loro caratteristiche funzionali.
- Gestire progetti informatici operando nel quadro di meccanismi di risoluzione dei problemi.
- Utilizzare strategie di gestione delle informazioni per garantire la sicurezza dei dati.
- Progettare e implementare architetture client-server per il 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.
- XAMPP (Apache e MySQL attivi)
- Editor di codice (VS Code consigliato)
- Database Manager (phpMyAdmin)
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
utentiaggiungendo un campoultimo_accessodi tipo DATETIME. - Task 2: Nel file
login.php, dopo la verifica corretta della password, esegui una query diUPDATEper salvare il timestamp attuale nel database per quell'utente. - Task 3: Visualizza la data dell'ultimo accesso nella pagina
area_riservata.phpprelevandola dal database.