4E - 4D SIA: La gestione della registrazione utenti con MD5 (file di testo e Php) e le sessioni

Soluzione della studentessa Laura Boienti 4 E SIA:
L'argomento in 4 E SIA è stato affrontato martedì 18 febbraio 2020




In informatica una funzione crittografica di hash è una classe speciale delle funzioni di hash che dispone di alcune proprietà che lo rendono adatto per l'uso nella crittografia.

Si tratta di un algoritmo matematico che mappa dei dati di lunghezza arbitraria (messaggio) in una stringa binaria di dimensione fissa chiamata valore di hash, ma spesso viene indicata anche con il termine inglese message digest (o semplicemente digest). Tale funzione di hash è progettata per essere unidirezionale (one-way), ovvero una funzione difficile da invertire: l'unico modo per ricreare i dati di input dall'output di una funzione di hash ideale è quello di tentare una ricerca di forza-bruta di possibili input per vedere se vi è corrispondenza (match). In alternativa, si potrebbe utilizzare una tabella arcobaleno di hash corrispondenti.

La funzione crittografica di hash ideale deve avere alcune proprietà fondamentali:

- deve identificare univocamente il messaggio, non è possibile che due messaggi differenti, pur essendo simili, abbiano lo stesso valore di hash;

- deve essere deterministico, in modo che lo stesso messaggio si traduca sempre nello stesso hash;

- deve essere semplice e veloce calcolare un valore hash da un qualunque tipo di dato;

- deve essere molto difficile o quasi impossibile generare un messaggio dal suo valore hash se non provando tutti i messaggi possibili.

Tali caratteristiche permettono alle funzioni crittografiche di hash di trovare ampio utilizzo negli ambiti della sicurezza informatica, quali firme digitali, codici di autenticazione dei messaggi (MAC) e altre forme di autenticazione. Possono essere utilizzati anche come funzioni di hash ordinarie, per indicizzare i dati nelle tabelle di hash, per la rilevazione di impronte digitali, per rilevare dati duplicati o identificare in modo univoco i file e come checksum per rilevare la corruzione accidentale dei dati. Infatti, nei contesti di sicurezza informatica, i valori di hash crittografici sono talvolta chiamati «impronte digitali» o «checksum» anche se tutti questi termini hanno funzioni più generali con proprietà e scopi piuttosto diversi.

In questo programma è stata utilizzata la funzione MD5

L'MD5 è una funzione hash crittografica realizzata da Ronald Rivest nel 1991 e standardizzata con la RFC 1321.

È una funzione unidirezionale diversa dalla codifica e dalla cifratura perché irreversibile.
Questa funzione prende in input una stringa di lunghezza arbitraria e ne produce in output un'altra a 128 bit. Il processo avviene molto velocemente e l'output (noto anche come "MD5 Checksum" o "MD5 Hash") restituito è tale per cui è altamente improbabile ottenere con due diverse stringhe in input uno stesso valore hash in output. Ad oggi sono disponibili molte risorse online che hanno buone probabilità di riuscire a decriptare parole comuni codificate.

A oggi, la disponibilità di algoritmi efficienti capaci di generare stringhe che collidono (ossia che producono in output lo stesso valore di hash) in un tempo ragionevole ha reso MD5 sfavorito rispetto ad altri algoritmi di hashing (vedi WHIRLPOOL, SHA-256 o RIPEMD-160), sebbene la sua diffusione sia a tutt'oggi molto estesa (basti pensare che il controllo di integrità più frequente su file si basa proprio su MD5).


Fonte: Wikipedia

Soluzione della studentessa Laura Boienti 4 E SIA

Esercizio completo

setting.php
viene assegnato ad una variabile il nome del file logico al file fisico che verrà gestito nel programma

<?php
$user_pass_txt = 'user_pass.txt';
?>


login.php 
In questa pagina php l'utente si logga oppure clicca sul link di registrazione

<html>
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Login Page</title>

     <!-- Owl-Carousel -->
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/OwlCarousel2/2.3.4/assets/owl.carousel.min.css"
        integrity="sha256-UhQQ4fxEeABh4JrcmAJ1+16id/1dnlOEVCFOxDef9Lw=" crossorigin="anonymous" />
    <link rel="stylesheet"
        href="https://cdnjs.cloudflare.com/ajax/libs/OwlCarousel2/2.3.4/assets/owl.theme.default.min.css"
        integrity="sha256-kksNxjDRxd/5+jGurZUJd1sdR2v+ClrCl3svESBaJqw=" crossorigin="anonymous" />

    <!-- icone -->
    <script src="https://kit.fontawesome.com/23412c6a8d.js"></script>

    <link rel="stylesheet" href="style.css">
  </head>
  <body>

<?php
session_start();
if (isset($_POST["invio"])) {
  $user_pass_txt = fopen("user_pass.txt", "r");
  $trovato = 0;
  $message=" ";
  while ((!feof($user_pass_txt)) && (!$trovato)) {
    $linea = fgets($user_pass_txt);
    $trovato = stristr($linea, $_POST["user"]);
    $user_pass_txt++;
  }
  fclose($user_pass_txt);
  list($username, $password) = explode(" | ", $linea);

  $pass=$_POST['pass'];
  if (($trovato)  && (md5($pass) == $password)) {
    $_SESSION["autorizzato"] = 1;
    $destinazione = "lettura.php";
  }else {
    $destinazione = "destroy.php";
  }
  echo '<script language=javascript>document.location.href="'.$destinazione.'"</script>';
}
?>
    <div class="container">
      <div class="row">
        <div class="col liquid">
          <img src="logo.png" alt="Logo" class="logo">

          <!-- Owl-Carousel -->
          <div class="owl-carousel owl-theme">
              <img src="./assets/undraw_authentication_fsn5.svg" alt="" class="login_img">
              <img src="./assets/undraw_personal_data_29co.svg" alt="" class="login_img">
              <img src="./assets/undraw_fingerprint_swrc.svg" alt="" class="login_img">
          </div>
          <!-- /Owl-Carousel -->
        </div>
             
        <div class="col login">
          <a href="registrazione.php" class="btn btn-signup">SIGN UP</a>
          <form method=post action="login.php">
            <div class="titles">
              <h6>We keep everything</h6>
              <h3>Ready to Login</h3>
              <p>
                <?php
                // Check if we need to add a message
                if(@$_GET["logout"]) echo "<span class = 'alert'>Logout effettuato con successo</span>";
                elseif(@$_GET["destroy"]) echo "<span class = 'alert'>Username e password non corretti</span>";
                elseif(@$_GET["registrazione"]) echo "<span class = 'alert'>Registrazione effettuata con successo</span>";
                ?>
              </p>
            </div>

            <div class="form-group" style="margin-top: 3rem;">
              <input type="text" name="user" placeholder="Username" class="form-input" required>
              <div class="input-icon">
                <i class="fas fa-user"></i>
              </div>
            </div>

            <div class="form-group">
              <input type="password" name="pass" placeholder="Password" class="form-input" required>
              <div class="input-icon">
                <i class="fas fa-user-lock"></i>
              </div>
            </div>

            <input type="submit" name="invio" value="LOGIN" class="btn btn-login"></input>
          </form>
        </div>
      </div>
    </div>

  <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/OwlCarousel2/2.3.4/owl.carousel.min.js"
        integrity="sha256-pTxD+DSzIwmwhOqTFN+DB+nHjO4iAsbgfyFq5K5bcE0=" crossorigin="anonymous"></script>

    <script>
        $(document).ready(function () {

            $('.owl-carousel').owlCarousel({
                loop: true,
                autoplay: true,
                autoplayTimeout: 2000,
                autoplayHoverPause: true,
                items: 1
            });
        });
    </script>
  <!--<form method=post action="login.php">
    <table width="300" cellpadding="4" cellspacing="1" border="0">
      <tr>
        <td colspan="2" align="left">
          <u>inserire username e password</u>:
        </td>
      </tr>
      <tr>
        <td colspan="2" align="left">
          <a href="registrazione.php">registrati</a>
          <?php
      // Check if we need to add a message
      /*if(@$_GET["logout"]) echo "| <span class = 'alert'>Logout effettuato con successo</span>";
      elseif(@$_GET["destroy"]) echo "| <span class = 'alert'>Username e password non corretti</span>";
      elseif(@$_GET["registrazione"]) echo "| <span class = 'alert'>Registrazione effettuata con successo</span>";*/
      ?>
        </td>
      </tr>
      <tr>
        <td>
          nome utente:
        </td>
        <td>
          <input type="text" name="user" required autofocus />
        </td>
      </tr>
      <tr>
        <td>
          password:
        </td>
        <td>
          <input type="password" name="pass" required />
        </td>
      </tr>
      <tr>
        <td colspan="2">
          <input type="submit" name="invio" value="invio">
          &nbsp;&nbsp;
          <input type="reset" name="cancella" value="cancella">
        </td>
      </tr>
    </table>
    <br>
  </form>-->
  </body>
  </html>


check.php
controllo se è attivata la sessione

<?php
session_start();
if (!isset($_SESSION["autorizzato"])) {
  echo "<h1>Area riservata - accesso negato</h1>";
  die();
}
?>

Lettura.php

questa pagina visualizza i dati inseriti nella registrazione e permette di accedere all'area riservata (con le sessioni)

<html>
<head>
<link rel="stylesheet" href="../filetesto/style.css" type="text/css" />
</head>
<body>
<h1>Lista utenti</h1>
<h2><a href="registrazione.php">Inserisci un nuovo utente</a></h2>
<h2><a href="logout.php">Logout</a></h2>
<table>
<tr>
<td>Username</td>
<td style="display:none;"></td>
<td style="display:none;"></td>
<td>Codice tesserino</td>
<td>Email</td>
</tr>
<?php
include("check.php");
include('setting.php');
$array_righi = file($user_pass_txt);
foreach($array_righi as $key => $chiavi){
list($username, $password, $password2, $tesserino, $email) = explode("|", $chiavi);
echo '
<tr>
<td>'.$username.'</td>
<td style="display:none;">'.$password.'</td>
<td style="display:none;">'.$password2.'</td>
<td>'.$tesserino.'</td>
<td>'.$email.'</td>
</tr>';
}
?>
</table>
</body>
</html>

registrazione.html

in questa pagina si accede perché l'utente deve registrarsi

<html>
<head>
</head>
<body>
<h2>REGISTRAZIONE NUOVO UTENTE</h2>
<form method=post action="registrazione_login.php">
    <table width="300" cellpadding="4" cellspacing="1" border="0">
    <tr>
        <td colspan="2" align="left">
          <?php
      // Check if we need to add a message
      if(@$_GET["passuguali"]) echo "| <span class = 'alert'>Inserisci password uguali</span><br>";
      elseif(@$_GET["account"]) echo "| <span class = 'alert'>Inserisci una acount gmail</span><br>";
      elseif(@$_GET["gmail"]) echo "| <span class = 'alert'>Inserisci una mail valida</span><br>";
      elseif(@$_GET["confronto"]) echo "| <span class = 'alert'>Account già registrato</span><br>";
      ?>
        </td>
      </tr>
      <tr>
        <td>
          <a href="registrazione_login.php?delete=' .$key. '">Elimina</a>
        </td>
      </tr>
      <tr>
        <td>
          nome utente:
        </td>
        <td>
          <input type="text" name="user" required autofocus />
        </td>
      </tr>
      <tr>
        <td>
          password:
        </td>
        <td>
          <input type="password" name="pass" required />
        </td>
      </tr>
      <tr>
        <td>
          ripeti password:
        </td>
        <td>
          <input type="password" name="pass2" required />
        </td>
      </tr>
      <tr>
        <td>
          codice tesserino:
        </td>
        <td>
          <input type="text" name="tesserino" required />
        </td>
      </tr>
      <td>
          email:
        </td>
        <td>
          <input type="text" name="email" required/>
        </td>
      </tr>
      <tr>
        <td colspan="2">
          <input type="submit" name="invio" value="invio">
          &nbsp;&nbsp;
          <input type="reset" name="cancella" value="cancella">
        </td>
      </tr>
    </table>
    <br>
  </form>
</body>
</html>

registrazione_login.php

in questa pagina si procede alla registrazione del nuovo utente con tutti idati memorizzati nel file di testo compresa la trasformazione della stringa criptata con la funzione MD5
unico vincolo che l'email deve essere "gmail"

<?php
include("setting.php");

/*************************
SCRITTURA
**************************/
if(isset($_POST['invio'])){
if(!is_writable($user_pass_txt)){
exit("il file non ha i permessi di scrittura!");
}
// riceviamo i dati e li filtriamo
$bad_char = array("|", "\r\n", "\r", "\n");
$username = str_replace($bad_char, " ", $_POST['user']);
$pass = str_replace($bad_char, " ", $_POST['pass']);
$pass2 = str_replace($bad_char, " ", $_POST['pass2']);
$tesserino = str_replace($bad_char, " ", $_POST['tesserino']);
$email = str_replace($bad_char, " ", $_POST['email']);

$password=md5($pass);
$password2=md5($pass2);



$linee= fopen("user_pass.txt",'r');

$length=filesize("user_pass.txt");

$leggi=fread($linee ,$length);

$pos= strpos($leggi , $username);

if ($pos===FALSE){
    header("location: login.php?registrazione=1");
}else{

    header("location: registrazione.php?confronto=1");
    }


if ($password2 != $password) {

header("location: registrazione.php?passuguali=1");
/*$message = "Inserisci password uguali";
echo "<script type='text/javascript'>alert('$message');</script>";*/
}
if (substr($email, -10) != "@gmail.com") {

header("location: registrazione.php?account=1");
/*$message = "Inserisci una acount gmail";
echo "<script type='text/javascript'>alert('$message');</script>";*/

}
if((stripos($email, "@") == FALSE) || (stripos($email, ".") == FALSE)){

header("location: registrazione.php?gmail=1");
/*$message = "Inserisci una mail valida";
echo "<script type='text/javascript'>alert('$message');</script>"; */
}

// apriamo il file
$open = fopen($user_pass_txt, "a+");
// scriviamo i dati separati dal carattere separatore
fwrite($open, $username." | ".$password." | ".$password2." | ".$tesserino." | ".$email."\r\n");
// chiudiamo il file
fclose($open);
}
// ritorniamo nella pagina di visualizzazione
//header("location: login.php");
//exit;


if(isset($_GET['delete'])){
    // creiamo l'array con tutti i righi
    $array_righi = file($user_pass_txt);
    // eliminiamo dall'array il rigo la chiave inviata via get
    unset($array_righi[$_GET['delete']]);
    // apriamo il file resettando il contenuto
    $nuovo = fopen($user_pass_txt, "w");
    foreach($array_righi as $key => $value){
        // ri-scriviamo tutti i righi (rimanenti)
        fwrite($nuovo, $value);
        }
    fclose($nuovo);
    // ritorniamo nella pagina di visualizzazione
    header("location: registrazione.php");
    exit;
    }
?>
<script type="text/javascript">
document.location.href = "login.php?registrazione=1";
</script>

destroy.php

in questa pagina si effettua la cancellazione della sessione e l'uscita dall'area riservata

<?php
session_start();
session_unset();
session_destroy();
?>
<script language="JavaScript">
document.location.href = "login.php?destroy=1";
</script>

Clicca qui e prova l'applicazione

Clicca qui per scaricare la procedura completa di Css

Commenti