PHP login script - Una semplice introduzione
Elementi
Utilizzeremo quattro file:- login_form.php
- login_check.php
- logout.php
- 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 | |
|---|---|
| CAMPO | TIPO |
| username | varchar(64) primary key |
| password | varchar(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
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.
