-- Parte Due --
A livello teorico è errato salvare la password in una variabile di sessione e/o in un cookie e/o variabili get.
Uno dei sistemi di login più sicuri è quello in cui l'utente inserisce il nome utente e la password, il sistema filtra (controlla quindi che i caratteri siano dentro un determinato range), cripta poi la password (esistono vari sistemi, md5, sha, crypt, etc), e fa un controllo sul database con quel nome utente e la password criptata (ovviamente a database devi avere solo la password criptata), se la query restituisce zero record allora l'utente ha toppato da qualche parte altrimenti se vi è un riscontro (e bada bene che se hai vari utenti può avere solo un riscrontro) ha inserito i dati giusti.
Se ha inserito i dati giusti tu setti una tua variabile di sessione, a valore booleano (true/false), numerico (0/1) o come vuoi te.
In tutte le altre pagine fai il controllo sulla variabile di sessione da te indicato che deve esistere ed avere un valore predeterminato.
Oltre a questo tutti i campi dei form devono sempre essere filtrati (campi di versi possono avere regole diverse), una volta filtrati e resi innocui li fai passare per il tuo database. (Sistema di sicurezza per evitare SQL Injection e simili).
Il problema si pone quando vuoi allungare il timeout standard delle sessioni (di norma circa 60 minuti). Esistono vari metodi, se hai bisogno del tasto remind me (checkbox), vai a creare un cookie nel computer dell'utente con una password di salto-login, ogni volta che l'utente cambia la password sul tuo sito questa mini-password cambia e viene cambiato il cookie con questa mini-password sul client.
All'avvio della tua applicazione controlli poi se è presente o meno questo valore e fai un confronto (dopo aver controllato che non vi siano caratteri speciali come < > - _ etcetera.
Esiste un'altro metodo (quello che uso io), io non ho bisogno del tasto ricordami, stò facendo un'applicazione web particolare, simile ad un cms, ma per fini privati, quindi stò usando prima di startare qualsiasi sessione (quindi prima del session_start(); ) il seguente comando:
Codice PHP:
session_set_cookie_params(0);
Questo comando dovrebbe far durare il timeout del cookie sino a che non chiude il browser. (e/o fa il logout).
Detto questo, come ben saprai hai due generi di variabili non sicure, i valori in $_GET ed in $_POST.
Normalmente tutto quello che inserisce l'utente va in $_POST , va filtrato e poi lo puoi passare a database.
Inoltre io uso i $_GET anche nel definire le varie funzioni dell'applicazione, ovviamente faccio dei controlli.
Se io faccio una pagina chiamata login_out.php
in cui dico che una determinata variabile get può essere 1 se deve fare il login e 2 se deve fare il logout cosa vado a fare ?
Codice PHP:
if (isset($_GET['act']) and trim($_GET['act']) != "") // controllo che la variabile sia settata e non sia vuota
{
$azione = trim($_GET['act']);
}
else
{
// Errore, mi segno un report nel database e sposto l'utente su un'altra pagina
}
switch ($azione)
{
case 1:
// Azioni di controllo per il login
break;
case 2:
// Azioni del logout
break;
default:
// Segno un tentativo di hacking nel database e sposto l'utente su un'altra pagina
break;
}
quindi alla fine io controllo tutti i campi $_GET e tutti i campi $_POST
una volta controllati questi mi sento abbastanza sicuro con la mia applicazione.
Rispetto alla mia pattern io nei campi nome_utente e password accetto SOLO caratteri alfanumerici, seguente pattern:
Codice PHP:
if (preg_match('/[^a-zA-Z0-9]/', $_POST['username']) == 0)
{
// Contiene solo caratteri alfanumerici
$username = trim($_POST['username']);
}
La prima parte dopo il preg_match sarebbe la pattern.