5E e 5I SIA: Login in Php e Mysql con hash md5, Session e CAPTCHA, con lezione per studenti DSA

Creare un sistema di login in PHP con una tabella utenti su MySQL, hash MD5 per le password, sessione e un CAPTCHA generato localmente è un buon esercizio per capire i concetti di base della sicurezza e autenticazione web. Ecco una guida passo-passo su come realizzarlo e un'introduzione per una lezione DSA.




Nota: l'uso di MD5 è sconsigliato per hash di password a causa della sua vulnerabilità a collisioni e attacchi rainbow table. Qui è utilizzato solo per scopi didattici. In un'applicazione reale, è preferibile usare algoritmi più sicuri come bcrypt o Argon2 con `password_hash()` di PHP.


Creazione del Database e della Tabella


Step 1: Creare un database e una tabella MySQL
Accedi al tuo server MySQL e crea un database e una tabella per memorizzare gli utenti:

```sql
CREATE DATABASE esempio_database;


CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(32) NOT NULL
);


Codice PHP per il Login


Step 2: Connessione a MySQL
Crea un file, `db_connect.php`, per connetterti al database:


```php
<?php
$servername = "localhost";
$username = "your_username";
$password = "your_password";
$dbname = "esempio_database";


// Creare connessione
$conn = new mysqli($servername, $username, $password, $dbname);


// Controlla connessione
if ($conn->connect_error) {
die("Connessione fallita: " . $conn->connect_error);
}
?>


Step 3: Form HTML per il Login
Crea un file `login_form.html` con il form di login:


```html
<!DOCTYPE html>
<html>
<head>
<title>Login</title>
</head>
<body>
<form action="login.php" method="post">
Username: <input type="text" name="username" required><br>
Password: <input type="password" name="password" required><br>
<!-- Captcha -->
<label for="captcha">Scrivi quanto segue:</label><br>
<img src="captcha.php" alt="CAPTCHA">
<input type="text" name="captcha" required><br>
<input type="submit" value="Login">
</form>
</body>
</html>

Step 4: Implementare il CAPTCHA
Crea un file `captcha.php` per generare il CAPTCHA:


<?php
session_start();


// Genera una stringa casuale
$captcha_code = substr(md5(rand()), 0, 6);


// Memorizza il codice nella sessione
$_SESSION['captcha'] = $captcha_code;


// Crea un'immagine
$image = imagecreatetruecolor(120, 30);


// Colori
$bg_color = imagecolorallocate($image, 255, 255, 255);
$text_color = imagecolorallocate($image, 0, 0, 0);


// Sfondo bianco
imagefilledrectangle($image, 0, 0, 120, 30, $bg_color);


// Aggiungi testo
imagestring($image, 5, 5, 5, $captcha_code, $text_color);


// Output dell'immagine
header("Content-type: image/png");
imagepng($image);
imagedestroy($image);
?>

Step 5: Script di Login con Sessione

Crea il file `login.php` per gestire l'autenticazione:


<?php
session_start();
include('db_connect.php');

if ($_SERVER["REQUEST_METHOD"] == "POST") {
$username = $_POST['username'];
$password = md5($_POST['password']); // Hash con MD5
$captcha_input = $_POST['captcha'];

// Verifica del CAPTCHA
if ($captcha_input != $_SESSION['captcha']) {
die("CAPTCHA errato!");
}

// Verifica dell'utente
$sql = "SELECT * FROM users WHERE username=? AND password=?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
$result = $stmt->get_result();

if ($result->num_rows === 1) {
$_SESSION['loggedin'] = true;
$_SESSION['username'] = $username;
header("Location: welcome.php"); // Pagina di benvenuto
} else {
echo "Nome utente o password errati.";
}
}
?>

Step 6: Registrazione utenti (opzionale)
Per Continuare lo sviluppo del sistema di autenticazione richiede alcuni passi aggiuntivi, tra cui la possibilità di registrare nuovi utenti e gestire la gestione delle sessioni. Qui sotto troverai non solo il codice per completare l'esercizio, ma anche spiegazioni che possono essere usate come parte di una lezione per gli studenti della DSA.


Registrazione degli Utenti

Creiamo un file `register.php` che permetta agli utenti di registrarsi:


<?php
include('db_connect.php');


if ($_SERVER["REQUEST_METHOD"] == "POST") {
$username = $_POST['username'];
$password = md5($_POST['password']); // Hash con MD5, non sicuro per applicazioni reali

// Verifica se l'utente esiste già
$sql = "SELECT * FROM users WHERE username=?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("s", $username);
$stmt->execute();
$result = $stmt->get_result();

if ($result->num_rows === 0) {
// Inserisci l'utente nel database
$sql = "INSERT INTO users (username, password) VALUES (?, ?)";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ss", $username, $password);

if ($stmt->execute()) {
echo "Registrazione completata con successo. Ora puoi <a href='login_form.html'>accedere</a>.";
} else {
echo "Errore durante la registrazione.";
}
} else {
echo "Nome utente già esistente. Scegliere un altro nome utente.";
}
}
?>


Form di Registrazione
Crea una pagina `register_form.html` per inserire i dati di registrazione:

```html
<!DOCTYPE html>
<html>
<head>
<title>Registrazione</title>
</head>
<body>
<form action="register.php" method="post">
Username: <input type="text" name="username" required><br>
Password: <input type="password" name="password" required><br>
<input type="submit" value="Registrati">
</form>
</body>
</html>
```

Gestione della Sessione e Logout


Step 7: Pagina di Benvenuto e Logout
Crea un file `welcome.php` per permettere agli utenti loggati di visualizzare una pagina di benvenuto:


```php
<?php
session_start();

if (!isset($_SESSION['loggedin'])) {
header("Location: login_form.html");
exit();
}

echo "Benvenuto, " . $_SESSION['username'] . "!";
?>

<a href='logout.php'>Logout</a>

Script di Logout
Crea un file `logout.php` per gestire la disconnessione:

<?php
session_start();
session_unset();
session_destroy();
header("Location: login_form.html");
exit();
?>

Spiegazione per gli studenti DSA e BES


1. Connessione al Database: L'importanza di proteggere le credenziali di connessione e gestire correttamente gli errori di connessione viene mostrata in `db_connect.php`.

2. Sicurezza delle Password: Sebbene in questo esempio si utilizzi MD5, gli studenti dovrebbero essere incoraggiati a cercare soluzioni più sicure come `password_hash()` di PHP. Questo perché la sicurezza delle password è critica per proteggere gli utenti da accessi non autorizzati.

3. CAPTCHA: Integrare un semplice CAPTCHA aiuta a prevenire attacchi di forza bruta. Anche se un CAPTCHA semplice non è infallibile, mostra come possiamo introdurre una barriera aggiuntiva.

4. Gestione delle Sessioni: L'uso di sessioni PHP per mantenere uno stato di login tra pagine diverse. Questo è fondamentale per le applicazioni web dove l'utente deve essere riconosciuto su più pagine dopo l'accesso.

5. Preparazione delle Query con SQL Prepared Statements: In `login.php` e `register.php` si utilizzano le query preparate per prevenire SQL Injection, un concetto chiave nella sicurezza delle applicazioni web.

6. User Experience (UX): La creazione di un flusso chiaro per registrarsi, accedere e disconnettersi è importante per creare una buona esperienza per l'utente.

Considerazioni Finali

- Miglioramenti di Sicurezza: Utilizzo di `https`, gestione delle sessioni con rigenerazione degli ID session dopo il login, e re-indirizzamento sicuro.

Commenti

Post popolari in questo blog

Simulazioni di reti (con Cisco Packet Tracer)

Esercizi in Excel e fogli di Google