L'ultimo articolo scritto su Sir Bit risale a marzo 2014. La versione che state visitando è un archivio: le pagine sono accessibili come sempre e gli autori potrebbero rispondere ai commenti, ma non saranno inseriti dei nuovi articoli. Visita questa pagina per i dettagli.

PHP – Creare uno strumento sicuro per il recupero della password dell’utente – Esempio completo

Nel realizzare un qualsiasi form di registrazione, o un’area di accesso in cui l’utente esterno dovrà inserire la sua login, dobbiamo prevedere la possibilità che il visitatore possa dimenticare la sua password. Non è una cosa poco frequente, soprattutto se l’utente utilizza password diverse per accedere ai suoi vari account: ricordarle tutte può diventare un’impresa.

Ecco allora che ci tornerà utile uno script per recuperare la password dimenticata.
I tipi di approccio sono molteplici: quello che vi vado a presentare è solo uno dei tanti e può essere adattato (e migliorato) in base all’esigenza, magari inserendo la classica “domanda” a cui l’utente dovrà rispondere per ricevere la password direttamente al suo indirizzo email.
In questo tutorial ho preparato alcune classi di esempio per formattare i campi tramite css: dovrete occuparvi voi di creare il dovuto foglio di stile, in base al layout del vostro sito.

Si dà per scontato che abbiate delle conoscenze, almeno di base, nell’uso delle funzioni php e nell’invio email con questo linguaggio. Inoltre è utile una conoscenza dell’uso dei database: nell’esempio, infatti, presuppongo che abbiate gli utenti salvati in un database di tipo mysql. Non è un passaggio obbligatorio – potete anche avere user e password elencati in un file – ma si tratta senz’altro di uno strumento più efficacie e immediato. In caso contrario, dovrete adattare lo script.
Potete anche prendere lo script così com’è e modificare soltanto l’essenziale. Ogni parte è dovutamente commentata.

Se siete invece interessati ad approfondire il tema del login, potete dare un’occhiata all’articolo che ho scritto a questo indirizzo.

Download script

Il form di login

Il nostro form di login, ridotto all’essenziale, avrà questa forma:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!--
Il form è solo di esempio. Cliccando sul link in basso si va al file “recupero.php”, che si occupa di recuperare la password.
-->

<form action="#form" method="post" id="login">

	<div class="campo_contatti">
		<div class="voce_campo">* email</div>
		<input type="text" name="email" value="<?=@$_POST['email']?>" class="campo" <?php if(!$email || !$password) echo $errore; ?> />
	</div>

	<div class="campo_contatti">
		<div class="voce_campo">* password</div>
		<input type="password" name="password" value="" class="campo" <?php if(!$email || !$password) echo $errore; ?> />
	</div>

	<div class="clear"></div>

	<div class="campo_contatti">
		<input type="submit" value="Accedi" />
	</div>

	<div class="clear"></div>

	<div class="campo_contatti">
		Hai dimenticato la password? Clicca <a href="recupero.php" style="color: red">qui</a>
	</div>

	<div class="clear"></div>

</form>

Nell’esempio l’utente deve inserire l’email e la password per accedere: avremo quindi il dato “email” già a disposizione in caso di smarrimento password. Nel caso in cui l’accesso avvenga invece per nickname, durante la registrazione dovrete aver predisposto un ulteriore campo per l’inserimento dell’email, un dato indispensabile per il recupero della password.

In caso di smarrimento della password, l’utente potrà cliccare sul link sottostante al form e verrà indirizzato al file recupero.php.

Form di recupero della password

Nel file di recupero della password avremo due passaggi chiave:
creazione di un form, dove l’utente scriverà la sua email (che corrisponde all’user di accesso) in cui riceverà la nuova password;
l’invio dell’email che conterrà il link a una nuova pagina, dove confermerà la richiesta di una nuova password. La conferma ci è necessaria per evitare che un qualsiasi intruso possa richiedere la password di un utente semplicemente conoscendo il suo indirizzo email, digitandolo come indirizzo nel browser.

Come valore univoco per identificare l’utente, prenderemo l’id con cui è salvato nel database.
Per chi ha meno dimestichezza, consiglio di dare un’occhiata prima alla parte del form e quindi alla parte riguardante l’invio email.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/* PARTE DELL’INVIO EMAIL. Si controlla che l'email (=user) sia presente nel db. Estraggo quindi id e password dell'utente e li unisco in un'unica stringa ($hash) da passare nel $_GET. La stringa su cui cliccare è inviata per email, come conferma, e rinvia al file “nuova_password.php”. */
if(isset($_POST['email'])){

	$errore=0; //variabile di controllo errori (se rimane a 0 non ci sono errori)

	if($_POST['email']==""){
		$errore=1;
	}else{
		$result=mysql_query("select id, password from utenti where email='".$_POST['email']."' limit 0,1", $db);

		if(mysql_num_rows($result)>0){
			$row=mysql_fetch_array($result);

			//l’hash ci servirà per recuperare i dati utente e confermare la richiesta
			//la password nel database si presume criptata, con md5 o altro algoritmo
			//al posto di questi due dati, se ne possono usare altri legati all’utente, purché univoci
			$hash=$row['password']."".$row['id'];

		}else
			$errore=1;

	}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
	//se non ci sono stati errori, invio l’email all’utente con il link da confermare
	if($errore==0){

		$header= "From: sito.it <info@sito.it>\n";
		$header .= "Content-Type: text/html; charset=\"iso-8859-1\"\n";
		$header .= "Content-Transfer-Encoding: 7bit\n\n";

		$subject= "sito.it - Nuova password utente";

		$mess_invio="<html><body>";
		$mess_invio.=" Clicca sul <a href=\"http://www.sito.it/nuova_password.php?hash=".$hash."\">link</a> per confermare la nuova password.<br /> Se il link non è visibile, copia la riga qui sotto e incollala sul tuo browser: <br /> http://www.sito.it/nuova_password.php?hash=".$hash." ";
		$mess_invio.='</body><html>';

		//invio email
		if(@mail($_POST['email'], $subject, $mess_invio, $header)){

			echo "<div class=\"campo_contatti\" style=\"margin-left: 20px; height: 300px\">";
			echo "Email inviata con successo. Controlla la tua email<br /><br />";

			echo "</div> <div class=\"clear\"></div>";
			unset($_POST); //elimino le variabili post, in modo che non appaiano nel form

		}

	}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!-- FORM BASE
L'utente inserisce la sua email (che dovrà corrispondere a quella salvata nel database).
-->

<form action="" method="post" id="login">

	<div class="campo_contatti">
		<div class="voce_campo">Inserisci la tua email per ricevere la nuova password</div>
		<input type="text" name="email" value="<?=@$_POST['email']?>" class="campo" />
	</div>

	<div class="clear"></div>

	<div class="campo_contatti">
		<input type="submit" value="invia" />
	</div>

	<div class="clear"></div>

</form>

Conferma della password

Una volta ricevuta l’email e cliccato sul link di conferma password, l’utente sarà indirizzato alla pagina nuova_password.php, dove sarà passata anche una variabile get contenente la vecchia password (criptata) e l’id dell’utente salvato nel database.
Anche qui i passaggi sono pochi:
– divido la variabile $hash nei suoi due componenti (vecchia password e id)
– creo una nuova password a random e la salvo nel database al posto di quella vecchia
– invio all’email dell’utente la nuova password creata

1
2
3
4
5
6
7
8
9
10
<?php
//funzione che crea una password random
function random($lunghezza=12){
	$caratteri_disponibili ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
	$codice = "";
	for($i = 0; $i<$lunghezza; $i++){
		$codice = $codice.substr($caratteri_disponibili,rand(0,strlen($caratteri_disponibili)-1),1);
	}
	return $codice;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?php
//il controllo del get evita errori di pagina

if(isset($_GET['hash'])){

	$hash=$_GET['hash'];

	$id=substr($hash, 32);
	$password_old=substr($hash, 0, 32);

	$password=random(8); //nuova password di 8 caratteri

	//controllo che i valori dell’hash corrispondano ai valori salvati nel database
	$result=mysql_query("SELECT * FROM utenti WHERE id=".$id." AND password='".$password_old."'", $db);

	if(mysql_num_rows($result)>0){ 

		$row=mysql_fetch_array($result);

		$email=$row['email'];

		//salvo la nuova password al posto della vecchia (in md5)
		$result=mysql_query("update utenti set password='".md5($password)."' where id=".$id." and password='".$password_old."'", $db);

		$header= "From: sito.it <info@sito.it>\n";
		$header .= "Content-Type: text/html; charset=\"iso-8859-1\"\n";
		$header .= "Content-Transfer-Encoding: 7bit\n\n";

		$subject= "sito.it - Nuova password utente";

		$mess_invio="<html><body>";
		$mess_invio.=" La sua nuova password utente è ".$password."<br /> Ora puoi accedere all'area <a href=\"http://www.sito.it/login.php\" style=\"color: red\">Login</a>. ";
		$mess_invio.='</body><html>';

		if(@mail($email, $subject, $mess_invio, $header)){?>
			La password è stata cambiata con successo. Controlla la tua email.<br /><br /> 
		<?php
		}

	}

} //if(isset($_GET['hash']))
?>
Etichette
Etichette:, , ,
Ultimi Commenti
  1. Antonio
  2. antonio
  3. antonio
  4. antonio
    • Max
  5. LaD
  6. Danilo
  7. Danilo
  8. TONY
  9. TONY
  10. Gaspare
      • Gaspare
        • Gaspare
          • Gaspare
          • Gaspare
          • Gaspare
          • Gaspare
  11. Marco Rossi

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.