Guide

Protezione di pagine web PHP tramite variabili di sessione

Esempi di programmazione

È possibile proteggere l'accesso alle pagine di un sito grazie a script in linguaggio php che usano variabili di sessione.

Una volta realizzato lo script in php (nell'esempio check.php), tale script dovrà essere richiamato in tutte le pagine del sito delle quali sintende proteggere l'accesso (nel nostro esempio la pagina da proteggere è unica ed è inizia.php).

L'esempio qui riportato utilizza quattro file:

  • login.php, pagina di login al sito web;
  • destroy.php, script di distruzione della sessione;
  • check.php, script di protezione dell'accesso;
  • pasx.txt, file di testo con utenti e password autorizzati.

Il principio è piuttosto semplice: la pagina di login verifica che 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 (pasx.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 pasx.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 pasx.txt è il seguente:

prova~:~prova
test~:~test
tentativo~:~tentativo

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"])) {
  $puntatore = fopen("testi/pasx.txt", "r");
  $trovato = 0;
  while ((!feof($puntatore)) && (!$trovato)) {
    $linea = fgets($puntatore);
    $trovato = stristr($linea, $_POST["userid"]);
    $puntatore++;
  }
  fclose($puntatore);
  list($nomeutente, $password) = split("~:~", $linea);
  if (($trovato)  && ($_POST["passwd"] == trim($password))) {
    $_SESSION["autorizzato"] = 1;
    $destinazione = "inizia.php";
  } else {
    $destinazione = "destroy.php";
  }
  echo '<script language=javascript>document.location.href="'.$destinazione.'"</script>';
} else {
  // HTML ?>
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  <html>
  <head>
  <title>Prova Login php</title>
  <meta name="Generator" content="EditPlus">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  </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>
<? //fine 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 pasx.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>

Ovviamente 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 inizia.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.

<? include("check.php"); ?>
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title> Pagina di test - PHP login </title>
<meta name="Generator" content="EditPlus">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
</head>
<body>
Esempio: login effettuato con successo
</body>
</html>