5E e 5I SIA: Gestione del CAPTHA completa e funzionante con Php, Mysql, le sessioni e Sha1
Questa lezione per una quinta SIA (Sistemi Informativi Aziendali) simula un caso reale: un'area riservata sicura. Passeremo dalla gestione del database alla protezione delle password, fino alla verifica "umana" con un CAPTCHA (anche se oggi si usano spesso librerie esterne, lo implementeremo in modo logico).
1. Il Database (MySQL)
Per prima cosa, creiamo la tabella utenti. Nota che la colonna password deve essere abbastanza lunga per contenere l'hash.
CREATE DATABASE gestione_accessi;
USE gestione_accessi;
CREATE TABLE utenti (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
password CHAR(40) NOT NULL, -- Lunghezza fissa per SHA1
email VARCHAR(100)
);
2. Architettura della Sicurezza
Prima di scrivere il codice, chiariamo i due pilastri della lezione:
* SHA1: È una funzione di hashing. Nota bene: Nel 2026 lo consideriamo superato per attacchi brute-force (meglio password_hash() con BCRYPT), ma per scopi didattici e compatibilità col tuo programma lo usiamo per capire il concetto di "impronta digitale" del dato.
* Sessioni: Permettono al server di "ricordare" chi sei tra una pagina e l'altra.
3. Il CAPTCHA (Logica in PHP)
Creiamo un file captcha.php che genera un'immagine con un codice casuale e lo salva in sessione.
<?php
session_start();
header('Content-type: image/png');
$codice = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyz"), 0, 6);
$_SESSION['captcha_code'] = $codice;
$immagine = imagecreate(100, 30);
imagecolorallocate($immagine, 220, 220, 220); // Sfondo
$colore_testo = imagecolorallocate($immagine, 0, 0, 0); // Testo nero
imagestring($immagine, 5, 20, 8, $codice, $colore_testo);
imagepng($immagine);
imagedestroy($immagine);
?>
4. Gestione Login e Registrazione
Ecco come dovresti strutturare il controllo del login.
Validazione e Hashing
<?php
session_start();
$host = "localhost"; $user = "root"; $pass = ""; $db = "gestione_accessi";
$conn = new mysqli($host, $user, $pass, $db);
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$user_input = $_POST['username'];
$pass_input = sha1($_POST['password']); // Hashing immediato
$captcha_input = $_POST['captcha'];
// 1. Verifica Captcha
if ($captcha_input !== $_SESSION['captcha_code']) {
die("Errore: Captcha errato!");
}
// 2. Query con Prepared Statements (Best Practice SIA)
$stmt = $conn->prepare("SELECT id FROM utenti WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $user_input, $pass_input);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows === 1) {
$_SESSION['autenticato'] = true;
$_SESSION['username'] = $user_input;
header("Location: area_riservata.php");
} else {
echo "Credenziali non valide.";
}
}
?>
5. Protezione dell'Area Riservata
In cima ad ogni pagina protetta (es. area_riservata.php), devi inserire questo controllo:
<?php
session_start();
if (!isset($_SESSION['autenticato']) || $_SESSION['autenticato'] !== true) {
header("Location: login.php");
exit;
}
echo "Benvenuto, " . $_SESSION['username'] . "! Questa è un'area sicura.";
?>

Commenti
Posta un commento