4D e 4E SIA: Protezione di pagine con PHP tramite variabili di sessione e credenziali salvate in file di testo (username e password)



Link cartella zippata dell'esercizio - clicca qui

Uno dei modi più semplici per proteggere l'accesso alle pagine di un sito salvato su un Server Web è utilizzare il linguaggio php  e scrivere uno script contenente le variabili di sessione.
In questo esempio useremo uno script in php che chiameremo check.php. Questo programma dovrà essere richiamato in tutte le pagine del sito dell'area riservata. 
Nel nostro caso il nome della pagina dopo il login sarà menu.php
.
L'esercizio che proveremo insieme contiene questi file:

Link cartella zippata dell'esercizio - clicca qui
  • login.php, pagina di login al sito web;
  • destroy.php, script di distruzione della sessione;
  • check.php, script di protezione dell'accesso;
  • registrazione.html pagina html per il modulo di registrazione
  • registrazione_login.php script di registrazione delle credenziali nel file di testo elenco_pass.txt
  • elenco_pass.txt, file di testo con utenti e password autorizzati.
  • setting.php script di assegnazione del file fisico al file logico
  • lettura.php pagina di destinazione dopo il login con la visualizzazione di tutte le credenziali (ovviamente questa pagina è solo di esempio
La pagina di login verifica se l'utente è autorizzato o meno ad accedere, impostando una variabile di sessione chiamata autorizzato, che sarà testata - grazie allo script check.php - da tutte le pagine interessate al controllo dell'accesso. Il controllo avviene, quindi, inserendo lo script check.php, in ogni pagina di interesse, prima del tag <html> cioè prima di inviare la pagina al browser.

Tutti i nomi utente e password dell'esempio, sono contenuti in un file di testo (elenco_pass.txt) che, per semplicità, non è criptato e quindi è in chiaro: in ogni caso è possibile aumentare il livello di sicurezza criptando sia il nome utente che la password tramite, ad esempio, la codifica MD5: http://www.php.net/manual/en/function.md5.php
Un'ulteriore protezione può essere introdotta posizionando il file elenco_pass.txt all'interno di una cartella dedicata, rendendolo inaccessibile alla lettura via web. Quest'ultima impostazione può essere effettuata in due modi:
  • via web, tramite il pannello di controllo per i piani Windows;
  • attraverso una modifica al file .htaccess per i piani Linux.
Ovviamente, la soluzione ottimale è quella di conservare i dati di accesso in un database.
Il contenuto del file di elenco_pass.txt è il seguente:
pasquale| rossi
paolo | latella
antonio | verdi
admin | admin
ogni riga del file contiene una coppia (user, passwd) separata dai caratteri speciali ~:~
Il contenuto del file login.php è il seguente:


<?php

session_start();

if (isset($_POST["invio"])) {

$elenco_password = fopen("elenco_pass.txt", "r");

$trovato = 0;

while ((!feof($elenco_password)) && (!$trovato)) {

$linea = fgets($elenco_password);

$trovato = stristr($linea, $_POST["userid"]);

$elenco_password++;

}

fclose($elenco_password);

list($nomeutente, $password) = explode(" | ", $linea);

if (($trovato) && ($_POST["passwd"] == trim($password))) {

$_SESSION["autorizzato"] = 1;

$destinazione = "lettura.php";

} else {

$destinazione = "destroy.php";

}

echo '<script language=javascript>document.location.href="'.$destinazione.'"</script>';

}

?>

<html>

<head>

<title>Prova Login php</title>

<meta name="Generator" content="EditPlus">

<meta name="Author" content="Laboratorio Sia">

<meta name="Keywords" content="">

<meta name="Description" content="esercizio gestione file">

</head>

<body>

<form method=post action="login.php">

<table width="300" cellpadding="4" cellspacing="1" border="0">

<tr>

<td colspan="2" align="left">

<u>inserite nome utente e password</u>:

</td>

</tr>

<tr>

<td>

nome utente:

</td>

<td>

<input type="text" name="userid">

</td>

</tr>

<tr>

<td>

password:

</td>

<td>

<input type="password" name="passwd">

</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>

Lo script login.php si preoccupa di mostrare all'utente il form di immissione dati (user e password) e di verificare che i valori immessi corrispondano ad una delle coppie presenti nel file elenco_pass.txt. Se l'utente viene riconosciuto (quindi è un utente autorizzato), lo script inizializza sia la sessione che la variabile autorizzato, indirizzando il browser verso la prima pagina protetta inizia.php; in caso contrario, (utente non autorizzato) viene richiamato lo script destroy.php che elimina tutto il contenuto della sessione aperta e rimanda alla pagina di login. Per il corretto funzionamento della sessione è molto importante che la pagina login.php riporti subito all'inizio del codice php, la riga:
session_start();
Il contenuto del file check.php è il seguente:
<?php
session_start();
if (!isset($_SESSION["autorizzato"])) {
  echo "<h1>Area riservata - accesso negato</h1>";
  die();
}
?>
Una volta attivata la variabile di sessione autorizzato, ogni pagina che includerà lo script check.php verrà visualizzata senza problemi se il login è andato a buon fine. Se, invece, il login non ha avuto successo, viene mostrato un messaggio di errore.
Tutte le pagine da proteggere dovranno contenere, prima del tag <html>, questa riga di codice:
<?php
include("check.php");
?>
La sessione viene terminata in due modi, chiudendo il browser, o richiamando lo script destroy.php.
Il contenuto del file destroy.php è il seguente:
<?php
session_start();
session_unset();
session_destroy();
?>
<script language="JavaScript">
document.location.href = "login.php"
</script>
 gli script mostrati in questo breve esempio non sono sufficienti se non vengono integrati con le pagine del sito da proteggere. Nel nostro esempio, quindi, integriamo gli script visti finora con il contenuto della pagina da proteggere lettura.php. L'integrazione viene effettuata inserendo, prima di tutto il codice HTML, il richiamo allo script check.php che testa se l'utente è autorizzato o meno all'accesso.
<html>

<head>
<link rel="stylesheet" href="../filetesto/style.css" type="text/css" /> 
</head>
<body>
<h1>Lista utenti</h1>
<h2><a href="registrazione.html">Inserisci un nuovo utente</a></h2>
<?php
include("check.php"); 
include('setting.php');
$array_righi = file($elenco_password);
foreach($array_righi as $key => $chiavi){
list($userid, $passwd) = explode("|", $chiavi);
echo '
<p>
Username: ' .$userid. '<br />
Password: ' .$passwd. '<br />
</p>
<hr />';
}
?>
</body>
</html>

Registrazione.html - Pagina html di registrazione (modulo form):


<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">
          <u>inserite nome utente e password</u>:
        </td>
      </tr>
      <tr>
        <td>
          nome utente: 
        </td>
        <td>
          <input type="text" name="userid">
        </td>
      </tr>
      <tr>
        <td>
          password: 
        </td>
        <td>
          <input type="password" name="passwd">
        </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>



Pagina: Registrazione_login.php script di registrazione delle credenziali nel file di testo elenco_pass.txt

La registrazione del record nel file di testo avviene tramite lo script già spiegato in un'altra lezione link:
<?php
include("setting.php");

/*************************
SCRITTURA
**************************/
if(isset($_POST['invio']))
{
if(!is_writable($elenco_password)){
exit("il file non ha i permessi di scrittura!");
}
// riceviamo i dati e li filtriamo
$bad_char = array("|", "\r\n", "\r", "\n");
$userid = str_replace($bad_char, " ", $_POST['userid']);
$passwd = str_replace($bad_char, " ", $_POST['passwd']);
// apriamo il file
$open = fopen($elenco_password, "a+");
// scriviamo i dati separati dal carattere separatore
fwrite($open, $userid." | ".$passwd."\r\n"); 
// chiudiamo il file  

fclose($open);

// ritorniamo nella pagina di visualizzazione
header("location: login.php");
exit;
}

?>

Link cartella zippata dell'esercizio - clicca qui

Lezione alla 4E - 12 novembre 2019
Lezione alla 4D - 14 novembre 2019

Buon lavoro

Paolo Latella

Commenti