Come posso implementare la procedura di reset di una password in PHP?

Come posso implementare la procedura di reset di una password in PHP?

La procedura di reset di una password si articola in diversi punti. Vediamoli insieme.

Il primo punto è solitamente quello di far inserire all'utente la sua email per procedere allo step successivo. La verifica consiste in una semplice query SQL:


SELECT email FROM tabella_utenti WHERE email = 'email';

email sarà la variabile POST presa dal form di reset della password. Se la verifica ha successo si può passare al punto successivo, che si articola in due fasi distinte:

  1. Generazione di un token random temporaneo da associare all'utenza che ha effettuato la richiesta.
  2. Invio di un'email con l'URL per il reset della password contenente il token random.

Nel vostro database dovrebbe essere presente una tabella separata collegata alla tabella degli utenti tramite l'ID utente contenente i seguenti campi:

  • ID utente
  • Token del reset
  • Timestamp UNIX relativo al momento in cui il token è stato creato

Quindi per creare il token avremo a titolo puramente indicativo:


$timestamp = time();
$random_id = crypt( str_shuffle( uniqid() ) );
$random_token = md5( $random_id );
// Inseriamo quindi i valori nella tabella con l'ID utente

Il timestamp ci permette di dare all'utente una scadenza per il reset della password (ad esempio 24 ore). Se il token è scaduto dovrà essere rimossso dalla tabella insieme a tutti gli altri dati relativi alla richiesta inoltrata. In pratica, si tratta di cancellare la lavagna periodicamente.

A questo punto nell'email dobbiamo creare l'URL per il reset. Abbiamo due opzioni sostanzialmente:

  1. Un URL indipendente dal profilo utente: ad esempio http://sito.tld/recovery/?t=TOKEN.
  2. Un URL legato al profilo utente: ad esempio http://sito.tld/username/recovery/?t=TOKEN o http://sito.tld/userid/recovery/?t=TOKEN.

In ogni caso è di vitale importanza verificare che:

  • Il token esista.
  • Il token non sia scaduto.

In tutti gli altri casi la pagina per il reset della password non dovrà mai essere accessibile direttamente.

Torna su