In questo articolo “Accesso all’area riservata in PHP” applichiamo quanto visto nella guida Le sessioni e i cookies in PHP realizzando gli script che ci consentono l’accesso ad un’area riservata di un sito Web

In questo articolo “Accesso all’area riservata in PHP” applichiamo quanto visto nella guida Le sessioni e i cookies in PHP realizzando gli script che ci consentono l’accesso ad un’area riservata di un sito Web


Script-accesso-allarea-riservata-1.zip (77 download )

Indice dei contenuti

Problema

Ipotizziamo di realizzare una login page di un sito Web contenente un form per il login ed un pulsante di registrazione. L’utente deve autenticarsi per accedere all’area riservata (una landing page). Se il login non va a buon fine lo script visualizza l’errore (username o password errata oppure utente non registrato). Se l’utente non è registrato, cliccando sul pulsante “registra”, si registra e viene reindirizzato alla login page. Se l’utente è registarto e il login va a buon fine viene reindirizzato alla landig page

Si vedano le guide precedenti. Utilizziamo il solito script OOP per connetterci al database “area_riservata”:

<?php
$servername = "localhost";
$username = "root";
$password = "";
$database = "area_riservata";

$conn = new mysqli($servername, $username, $password, $database);

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

Realizziamo lo script con la prima parte in PHP e la seconda in HTML (per la visualizzazione del form). Gli step per la realizzazione dello script sono:

  • Avviamo una sessione per mantenere informazioni come il nome utente o il ruolo.
  • Includiamo il file per la connessione al database
  • Verifichiamo che il metodo della richiesta è POST e acquisiamo i dati di login inseriti dall’utente
  • Controlliamo se la connessione al database è valida, altrimenti terminiamo il processo.
  • Scriviamo la query per controllare se lo username inserito dall’utente è presente nel database
  • Prepariamo la query associando il parametro per evitare SQL Injection
  • Eseguiamo la query
  • Se otteniamo il risultato:
    • verifichiamo che la password inserita dall’utente coincida con quella memorizzata nel database
    • se l’autenticazione va a buon fine memorizziamo le informazioni nella sessione e reindirizziamo alla landing page altrimenti visualizziamo il messaggio di errore “Password errata”
  • Se non otteniamo risultati visualizziamo il messaggio di errore “Utente non trovato”
  • Chiudiamo lo statement della prepared query
  • Chiudiamo la connessione
  • Realizziamo il form di login in HTML

Qui di seguito il codice:

Copy
<?php
// Avviamo una sessione per mantenere informazioni come il nome utente o il ruolo.
session_start(); 

// Includiamo il file per la connessione al database
require_once "connessione.php"; 

if ($_SERVER["REQUEST_METHOD"] == "POST") { // Verifichiamo che il metodo della richiesta è POST e acquisiamo i dati di login inseriti dall'utente.
    $username = $_POST["username"]; 
    $password = $_POST["password"];   

    // Controlliamo se la connessione al database è valida, altrimenti terminiamo il processo.
    if (!$conn) { 
        die("Errore di connessione: " . mysqli_connect_error()); 
    }     

    // Controlliamo l'utente: query SQL per verificare se esiste un utente con il nome utente fornito.
    $sql = "SELECT id, username, password, ruolo FROM utenti WHERE username = ?"; 

    // Prepariamo e associamo il parametro per evitare SQL injection.
    $stmt = mysqli_prepare($conn, $sql); 
    $stmt->bind_param( "s", $username); 

    // Eseguiamo la query e ottieniamo il risultato.
    $stmt->execute(); 
    $result = $stmt->get_result();
    

    if ($row = $result->fetch_assoc()) { 
        if (password_verify($password, $row["password"])) { 
            // Verifichiamo che la password inserita dall'utente corrisponda alla password memorizzata
            $_SESSION["username"] = $row["username"]; 
            $_SESSION["ruolo"] = $row["ruolo"]; 
            if ($_SESSION["ruolo"]== "admin"){
                // Autenticazione riuscita: salviamo le informazioni nella sessione e reindirizziamo alla pagina di destinazione
            header("Location: landing_page.php"); 
            exit();
            }else{
                // Messaggio di errore se l'utente non ha i privilegi di accesso
                $error = "Non sei amministratore!";
            }             
        } else { 
            // Messaggio di errore se la password non è corretta
            $error = "Password errata.";              
        } 
    } else { 
        // Messaggio di errore se il nome utente non esiste nel database
        $error = "Utente non trovato.";          
    }
    // Chiude lo statement e la connessione per evitare problemi di risorse.
    $stmt->close();
    $conn->close();     
}
?>
<!DOCTYPE html> 
<html lang="it"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Login</title>     
    <!-- link al foglio di stile CSS per il design -->
    <link rel="stylesheet" href="stile.css"> 
</head> 
<body> 
    <div class="container"> 
        <h2>Login</h2> 
        <!-- Visualizza un messaggio di errore, se presente, in rosso -->
        <?php if (!empty($error)) echo "<p style='color: red;'>$error</p>"; ?> 
            <form method="POST" action=""> 
                <!-- Campo per inserire il nome utente -->
                <label for="username">Username:</label> 
                <input type="text" id="username" name="username" required>           

                <br> 
                <!-- Campo per inserire la password -->
                <label for="password">Password:</label> 
                <input type="password" id="password" name="password" required>            

                <br> 
                <!-- Pulsante per inviare il form -->
                <button type="submit">Accedi</button> 
                
            </form> 
        <!-- Link per la pagina di registrazione -->
        <a href="registrazione.php" class="btn">Registrati</a> 
        
    </div> 
</body> 
</html>

Come vedremo in seguito nello script di registrazione, utilizzeremo un metodo sicuro per la gestione delle password:

  • password_hash() che crea l’hash della password utilizzando algoritmi moderni come bcrypt, che sono molto più sicuri rispetto a md5(), sha1(),…
  • password_verify() per confrontare l’ hash della password in chiaro inserita dall’utente con quella salvata

Realizziamo lo script con la prima parte in PHP e la seconda in HTML (per la visualizzazione del form). Gli step per la realizzazione dello script sono:

  • Importiamo il file per la connessione al database.
  • Verifichiamo che il metodo della richiesta è POST e acquisiamo i dati di registrazione inseriti dall’utente.
  • Facciamo l’Hash della password per garantire una maggiore sicurezza.
  • Impostiamo il ruolo predefinito come “utente normale”.
  • Controlliamo se lo username è già in uso
  • Prepariamo la query per evitare SQL injection
  • Eseguiamo la query e memorizziamo i risultati
  • Se lo username è già in uso:
    • Notifichiamo all’utente che il nome utente è già stato scelto da qualcun altro.
  • altrimenti:
    • Prepariamo una query per inserire l’utente nel database e leghiamo i parametri: username, password e ruolo.
    • Se la query è stata eseguita con successo, confermiamolo all’utente e forniamo un link al login.
    • Altrimenti mostriamo un messaggio di errore specifico
    • Chiudiamo lo statement per liberare risorse.
  • Chiudiamo sia lo statement di verifica esistenza username che la connessione al database.
  • Realizziamo il form di registrazione in HTML

Qui di seguito il codice:

Copy
<?php
// Importiamo il file per la connessione al database.
require 'connessione.php';

if ($_SERVER["REQUEST_METHOD"] == "POST") {//Verifichiamo che il metodo della richiesta è POST e acquisiamo i dati di registrazione inseriti dall'utente.
    $username = $_POST["username"];
    $password = password_hash($_POST["password"], PASSWORD_DEFAULT);// Hash della password per garantire una maggiore sicurezza. PASSWORD_DEFAULT utilizza l'algoritmo bcrypt
    
    // Impostiamo il ruolo predefinito come "utente normale".
    $ruolo = 'user';     

    // Controlliamo se lo username è già in uso
    $checkUser = $conn->prepare("SELECT id FROM utenti WHERE username = ?");

    // Prepariamo la query per evitare SQL injection 
    $checkUser->bind_param("s", $username);

    //Eseguiamo la query e memorizziamo i risultati
    $checkUser->execute();
    $checkUser->store_result(); 

    if ($checkUser->num_rows > 0) {//Se lo username è già in uso
        // Notifichiamo all'utente che il nome utente è già stato scelto da qualcun altro.
        echo "Errore: Username già in uso.";        
    } else {
        // Inserimento nuovo utente
        // Prepariamo una query per inserire l'utente nel database e leghiamo i parametri: username, password e ruolo.
        $stmt = $conn->prepare("INSERT INTO utenti (username, password, ruolo) VALUES (?, ?, ?)");
        $stmt->bind_param("sss", $username, $password, $ruolo);        

        if ($stmt->execute()) {// Se la query è stata eseguita con successo, confermiamolo all'utente e forniamo un link al login.
            echo "Registrazione completata con successo! <a href='login.php'>Vai al login</a>";            
        } else {// Mostriamo un messaggio di errore specifico
            echo "Errore: " . $stmt->error;            
        }
        $stmt->close();// Chiudiamo lo statement per liberare risorse.
    }
    // Chiudiamo sia lo statement di verifica esistenza username che la connessione al database.
    $checkUser->close();
    $conn->close();    
}
?>
<!DOCTYPE html>
<html lang="it">
<head>
    <meta charset="UTF-8">
    <title>Registrazione</title>
    <!-- colleghiamo il foglio di stile per il design -->
    <link rel="stylesheet" href="stile.css">    
</head>
<body>
    <div class="container">
        <h2>Registrazione</h2>
        <form method="POST">
            <!-- Campo obbligatorio per inserire lo username -->
            <label>Username:</label>
            <input type="text" name="username" required>        

            <br>
            <!-- Campo obbligatorio per inserire la password -->
            <label>Password:</label>
            <input type="password" name="password" required>        

            <br>
            <!-- Pulsante per inviare il modulo -->
            <button type="submit">Registrati</button>       
        </form>
    </div>
</body>
</html>

4. Realizzazione di logout.php

Il file di logout è molto semplice e spiegato nella guida Le sessioni e i cookies in PHP riportiamo solo il codice:

<?php
session_start();
session_unset();
session_destroy();

header("Location: login.php");
exit();
?>

5. Realizzazione di landing_page.php

Realizziamo ora una semplice landing_page che visualizzi il messaggio di benvenuto ed un link di logout:

<?php
session_start();

if (!isset($_SESSION["username"])) {
    header("Location: login.php");
    exit();
}
?>

<!DOCTYPE html>
<html lang="it">
<head>
    <meta charset="UTF-8">
    <title>Landing Page</title>
    <link rel="stylesheet" href="stile.css">
</head>
<body>
    <div class="welcome-container">
        <h1>Benvenuto, <?php echo htmlspecialchars($_SESSION["username"]); ?>!</h1>
    </div>
</body>
</html>

6. Realizzazione di stile.css

Diamo un minimo di stile alle pagine:

/* Impostazioni generali */
body {
    font-family: Arial, sans-serif;
    background-color: #f4f4f9;
    margin: 0;
    padding: 0;
    color: #333;
}

.container {
    max-width: 500px;
    margin: 50px auto;
    padding: 20px;
    background-color: #fff;
    border-radius: 8px;
    box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
    text-align: center;
}

.welcome-container {
    display: flex; /* Usa il layout Flexbox */
    flex-direction: column;
    justify-content: center; /* Centra orizzontalmente */
    align-items: center; /* Centra verticalmente */
    height: 100vh; /* Altezza pari all'intero viewport */
    text-align: center; /* Centra il testo */
    background-color: #f4f4f9; /* Colore di sfondo per un tocco estetico */
}

/* Stile per il titolo */
.welcome-container h1 {
    font-size: 2.5em;
    color: #333;
}


/* Stile per titoli */
h2 {
    color: #444;
    margin-bottom: 20px;
}

/* Stile per i form */
form {
    display: flex;
    flex-direction: column;
    gap: 15px;
}

label {
    font-weight: bold;
    text-align: left;
    margin-bottom: 5px;
}

input[type="text"],
input[type="password"] {
    padding: 10px;
    border: 1px solid #ddd;
    border-radius: 4px;
    font-size: 16px;
}

button {
    padding: 10px 15px;
    font-size: 16px;
    font-weight: bold;
    color: #fff;
    background-color: #007BFF;
    border: none;
    border-radius: 4px;
    cursor: pointer;
}

button:hover {
    background-color: #0056b3;
}

/* Stile per il link di registrazione */
a.btn {
    display: inline-block;
    margin-top: 20px;
    padding: 10px 15px;
    font-size: 16px;
    text-decoration: none;
    color: #007BFF;
    border: 1px solid #007BFF;
    border-radius: 4px;
    background-color: transparent;
}

a.btn:hover {
    background-color: #007BFF;
    color: #fff;
}

/* Stile per messaggi di errore */
p.error {
    color: red;
    font-weight: bold;
    margin-bottom: 15px;
}

7. Test della soluzione al problema

A questo punto possiamo testare la nostra soluzione. Per fare questo aprimao XAMPP, facciamo partire il Web Server Apache e MySQL. In corrispondenza di MySQL clicchiamo “admin”. Si aprirà l’interfaccia PHPMyAdmin. Clicchiamo su SQL e inseriamo il seguente codice per creare il database “area_riservata” e la tabella “utenti”:

CREATE DATABASE IF NOT EXISTS area_riservata;

USE area_riservata;

CREATE TABLE utenti (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    password VARCHAR(255) NOT NULL,
    ruolo ENUM('admin', 'user') NOT NULL DEFAULT 'user'
);

Dopo aver creato il database e la tabella creiamo una cartella in htdocs “area_riservata” e salviamo al suo interno gli script PHP visti in precedenza ed il file css.

Fatto questo apriamo il browser e sulla barra degli indirizzi scriviamo

localhost/area_riservata/login.php

Nella sezione DOWNLOAD o direttamente da qui: https://profgiagnotti.it/download/4860/?tmstv=1744539632 è possibile scaricare gli script descritti nell’articolo

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *