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

Post popolari in questo blog

Esercizi in Excel e fogli di Google

Le domande (e le risposte) all'orale di informatica esame di stato nei corsi: Sistemi Informativi aziendali (ex programmatori), Itis Informatica (ex Abacus), Liceo Tecnologico