Soluzioni informatiche per l'impresa
Principale Servizi Soluzioni Supporto & Download Chi siamo Contatta
 

In questo articolo diamo alcune indicazioni per creare un semplice sistema di login basato su PHP e MySQL. L'articolo ha una finalità didattica: una realizzazione professionale e sicura richiederebbe nuomerosi accorgimenti supplementari.
Creative Commons License
Questa opera è pubblicata sotto Licenza Creative Commons.

PHP login script - Una semplice introduzione

Elementi

Utilizzeremo quattro file:
  1. login_form.php
  2. login_check.php
  3. logout.php
  4. main.php

I - Creazione tabelle nel database

Supponiamo che nel database esista una tabella per l'autenticazione degli utenti analoga alla seguente:

La soluzione più sicura consiste nel memorizzare un hash crittografico della password anziché la password in chiaro. In PHP si può utilizzare una di queste funzioni (non sono le uniche):
md5
Calculates the MD5 hash of str using the RSA Data Security, Inc. MD5 Message-Digest Algorithm and returns that hash.
sha1
Calculates the sha1 hash of str using the US Secure Hash Algorithm 1.
TABELLA utenti
CAMPOTIPO
usernamevarchar(64) primary key
passwordvarchar(64) not null

Il nostro esempio assume, per semplicità, che le password siano memorizzate in chiaro all'interno del database. In generale questa non è una buona idea e costituisce un serio rischio per la sicurezza del sistema.

II - Creazione del file login_form.php

Login








Motivi di accessibilità richiederebbero il ricorso ad access key.
<form action="login_check.php" method="post">
  <fieldset style="display:inline">
    <legend>Login</legend>
    <br/>
    <label for="username">USERNAME</label>
    <br/>
    <input type="text" size="32" id="username" name="username" />
    <br/><br/>
    <label for="password">PASSWORD</label>
    <br/>
    <input type="password" size="32" id="password" name="password" />
    <br/>
    <br/><br/>
    <input type="submit" name="Submit" value="Login" />
  <fieldset>
</form>

III - Creazione del file login_check.php

<?php
  session_start();
  ob_start();

  // Connessione al server ed apertura del database
  mysql_connect('localhost','root','eccolamiapassword') or die('Connessione impossibile');
  mysql_select_db('nome_database') or die('Impossibile aprire database');

  // Definizione di $myusername e $mypassword
  $myusername = $_POST['username'];
  $mypassword = $_POST['password'];
Per arginare attacchi quali l'SQL injection, una parziale misura di sicurezza potrebbe consistere nell'aggiungere le istruzioni:
$myusername = stripslashes($myusername);
$mypassword = stripslashes($mypassword);
$myusername = mysql_real_escape_string($myusername);
$mypassword = mysql_real_escape_string($mypassword);

  $sql = "SELECT * FROM utenti WHERE username='".$myusername."' and password='".$mypassword."'";
  $result = mysql_query($sql);

  // mysql_num_row conta il numero di tuple lette
  $count = mysql_num_rows($result);

  // Se l'autenticazione è corretta, ci deve essere un'unica corrispondenza nella tabella utenti
  if ($count == 1)
  {
    // Login effettuato e redirect verso main.php
    $_SESSION['logged'] = 'ok';
    header('location:main.php');
  }
  else
  {
    echo 'Autenticazione fallita.';
    $_SESSION['logged'] = '';
  }

  ob_end_flush();
?>

IV - Creazione del file main.php

In generale per tutte le pagine che vogliamo proteggere, aggiungeremo un controllo utente di questo tipo:
<?php
  session_start();
  if (!isset($_SESSION['logged']) || $_SESSION['logged'] == '')
  {
    header('location:login_form.php');
  }
?>

<html>
  <body>
    Login effettuato
  </body>
</html>

V - Creazione del file logout.php

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

Altri aspetti da valutare

  • Verificare se l'utente ha già effettuato il login.
  • Utilizzare i cookie al posto delle sessioni.
  • Registrare informazioni supplementari (data del login, IP dell'utente).
  • Realizzare un meccanismo per inviare all'utente una nuova password nel caso abbia dimenticato l'originale.
  • Creare sessioni che scadano "a tempo" per evitari gli enumeration attack.
 
Mappa del sitoOpportunitàCollegamentiRiservatezzaNote legaliAccessibilitàW3C
Tutti i marchi ed i copyright in questa pagina sono di proprietà dei rispettivi proprietari. Per il resto © EOS (Pisa). Ultimo aggiornamento: 2011-2-26.