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.
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:
ogni riga del file contiene una coppia
(user, passwd) separata dai caratteri speciali ~:~
<?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">
<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();
<?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");
?>
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">
<input type="reset" name="cancella" value="cancella">
</td>
</tr>
</table>
<br>
</form>
</body>
</html>
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
Posta un commento