Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Pour commencer
Comment allons-nous procéder ?
Je vais adopter une technique à peu près similaire à celle du Site du Zér0.
Dans un premier temps, nous allons demander au membre en question de rentrer son adresse e-mail de contact, afin de vérifier pour commencer qu'elle est bien dans nos tables.
Puis nous allons envoyer un mail de vérification au membre via cette adresse, qui permettra de vérifier si c'est bien le propriétaire de l'adresse qui a fait la demande de redéfinition. Dans ce mail, nous inviterons le membre à cliquer sur un lien particulier, qui le renverra sur une page de votre site.
La page de ce site va générer aléatoirement un nouveau mot de passe et remplacer l'ancien avant de l'envoyer dans un nouveau mail.
Le membre pourra donc se reconnecter sur votre site. À vous ensuite de lui permettre de changer son mot de passe par le sien (plus "mémorisable" que notre charabia aléatoire du type :
h6z8f9k9a0) via un formulaire du type "
Modifier son compte" que je ne traiterai pas ici.
Vous allez devoir ajouter un champ dans la table membres de votre base de données :
verif de type VARCHAR (10).
Page oublie_mdp.php
Dans cette page se trouvera un simple formulaire avec un champ de type "texte" et un bouton "
Envoyer".
On traitera le formulaire et la gestion du premier mail dans cette même page. C'est pourquoi le
action de la
<form> pointera vers la même page.
Le formulaire
Code : HTML1
2
3
4 | <form method="post" action="./oublie_mdp.php">
<input type="text" name="email">
<input type="submit" value="Envoyer les informations">
</form>
|
Rien de bien compliqué jusqu'à présent. Si vous ne comprenez pas, je vous invite à lire les cours de M@teo21 sur les
formulaires.
La récupération
Vu que nous traitons le tout sur la même page, nous allons devoir vérifier qu'une adresse e-mail a bien été envoyée par
POST, auquel cas nous traiterons la demande.
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | <?php
//Vérification de l'existence de la variable ; on vérifie aussi qu'elle n'est pas vide
if((isset($_POST['email'])) && (!(empty($_POST['email']))))
{
// Le code ici...
}
else
{
?>
<form method="post" action="./oublie_mdp.php">
<input type="text" name="email">
<input type="submit" value="Envoyer les informations">
</form>
<?php
}
?>
|
Que va-t-on mettre dans cette condition ?
Très simple ! On va commencer par vérifier si l'adresse e-mail existe dans vos tables !
Code : PHP1
2
3
4
5 | <?php
$mail = htmlspecialchars($_POST['email'], ENT_QUOTES); // On sécurise la variable avant
//On compte le nombre d'entrée(s) dans la table où le champ "mail" vaut $mail
$nombremail = mysql_result(mysql_query("SELECT COUNT(*) FROM membres WHERE mail = '".$mail."'"), 0);
?>
|
Maintenant, si
$nombremail n'est pas égale à "0", c'est-à-dire que le mail existe, on continue. Sinon, on affiche une erreur, et pourquoi pas le formulaire à nouveau ?
Code : PHP 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 | <?php
//Vérification de l'existence de la variable ; on vérifie aussi qu'elle n'est pas vide
if((isset($_POST['email'])) && (!(empty($_POST['email']))))
{
$mail = htmlspecialchars($_POST['email'], ENT_QUOTES); // On sécurise la variable avant
//On compte le nombre d'entrée(s) dans la table où le champ "mail" vaut $mail
$nombremail = mysql_result(mysql_query("SELECT COUNT(*) FROM membres WHERE mail = '".$mail."'"), 0);
if ($nombremail!= 0)
{
// Le code ici...
}
else
{
?>
<h3><span style=\'color:red\'>ERREUR : Votre adresse e-mail n\'existe pas dans la table.</span></h3><br />//écriture de l'erreur
<form method="post" action="./oublie_mdp.php">
<input type="text" name="email">
<input type="submit" value="Envoyer les informations">
</form>
<?php
}
}
else
{
?>
<form method="post" action="./oublie_mdp.php">
<input type="text" name="email">
<input type="submit" value="Envoyer les informations">
</form>
<?php
}
?>
|
"Mot" aléatoire
Nous allons avoir besoin d'un "mot" aléatoire qui va servir dans le lien du mail que je traiterai plus bas.
Pour cela je vais procéder d'une manière très simple, mais efficace. Évidemment, si vous connaissez un autre moyen, allez-y gaiement !
Mon "mot" aléatoire aura cette forme :
1g2a9o5f0f.
Autrement dit :
chiffre lettre chiffre lettre chiffre lettre chiffre lettre chiffre lettre.
Je commence donc par créer un tableau (un array) contenant l'alphabet (vous pourrez changer ceci par ce que vous voudrez) :
Code : PHP1
2
3 | <?php
$tablettre = array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z");
?>
|
Puis j'initialise la fonction de la génération aléatoire :
Code : PHP1
2
3 | <?php
mt_srand((float) microtime()*10000);
?>
|
Et je crée cinq premières variables
$a,
$b,
$c,
$d, et
$e qui contiendront un chiffre aléatoire entre 0 et 9 :
Code : PHP1
2
3
4
5
6
7 | <?php
$a = mt_rand(0, 9);
$b = mt_rand(0, 9);
$c = mt_rand(0, 9);
$d = mt_rand(0, 9);
$e = mt_rand(0, 9);
?>
|
Je crée maintenant les cinq dernières variables
$f,
$g,
$h,
$i,
$j, qui elles, contiendront un nombre aléatoire entre 0 et 25. Je les utiliserai pour récupérer l'élément de l'array "
tablettre". Je rappelle qu'un tableau commence à l'indice "0" et se termine à l'indice "N-1" :
| Indice | Valeur |
|---|
0 |
A |
1 |
B |
2 |
C |
... |
... |
... |
... |
24 |
Y |
25 |
Z |
Code : PHP1
2
3
4
5
6
7 | <?php
$f = mt_rand(0, 25);
$g = mt_rand(0, 25);
$h = mt_rand(0, 25);
$i = mt_rand(0, 25);
$j = mt_rand(0, 25);
?>
|
Je concatène le tout pour n'en faire qu'une seule et même variable :
Code : PHP1
2
3 | <?php
$motaleatoire = $a.$tablettre[$f].$b.$tablettre[$g].$c.$tablettre[$h].$d.$tablettre[$i].$e.$tablettre[$j];
?>
|
Le mail
Maintenant, nous avons tout ce qu'il nous faut !
Il ne reste plus qu'à rédiger le mail.
On commence par afficher le message :
Code : PHP1
2
3 | <?php
echo 'Votre adresse email '.$mail.' existe dans nos tables et un mail de vérification vient de vous être envoyé.<br /><br />Consultez votre boîte mail, des explications vous seront fournies.';
?>
|
Puis le contenu du mail :
Code : PHP1
2
3 | <?php
$message = '<h5>Bonjour !<br>Vous avez demandé à redéfinir votre mot de passe. Veuillez cliquer sur le lien de vérification ci-dessous afin qu\'un nouveau mot de passe soit défini.<br><br></h5><a>http://www.votre-site.com/verif_mdp.php?e='.$mail.'&v='.$motaleatoire.'</a><br><br><br><h6>Ce mail a été envoyé automatiquement, veuillez ne pas y répondre.<br>Si ce mail vous a été envoyé alors que vous n\'en avez pas fait la demande, ne vous inquiétez pas, personne à part vous ne pourra redéfinir votre mot de passe.</h6>';
?>
|
Dans l'adresse de vérification, j'ajoute les paramètres "e" (pour e-mail) avec l'adresse e-mail du destinataire, et "v" (pour vérification) avec la variable
$motaleatoire.
Je rajoute les normes "mail" :
Code : PHP1
2
3
4
5
6
7
8 | <?php
$message = '<html><head></head><body>' . $message . '</body></html>';
$sujet = 'webmaster de votre-site.com : Mail de vérification';
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$headers .= 'From: vous@votre-site.com';
?>
|
On envoie le tout par mail :
Code : PHP1
2
3 | <?php
mail($mail, $sujet, $message, $headers);
?>
|
Et on met à jour le champ
verif de la table
membres avec la variable
$motaleatoire.
Code : PHP1
2
3 | <?php
mysql_query('UPDATE membres SET verif="' . $motaleatoire . '" WHERE mail="' . $mail .'"') OR DIE (mysql_error());
?>
|
Voilà !
On a fini la première partie.
Résumons.
Page oublie_mdp.php
Code : PHP 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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67 | <?php
//Vérification de l'existence de la variable ; on vérifie aussi qu'elle n'est pas vide
if((isset($_POST['email'])) && (!(empty($_POST['email']))))
{
$mail = htmlspecialchars($_POST['email'], ENT_QUOTES); // on sécurise la variable avant
//On compte le nombre d'entrée(s) dans la table où le champ "mail" vaut $mail
$nombremail = mysql_result(mysql_query("SELECT COUNT(*) FROM membres WHERE mail = '".$mail."'"), 0);
if ($nombremail!= 0)
{
$tablettre = array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z");
mt_srand((float) microtime()*10000);
$a = mt_rand(0, 9);
$b = mt_rand(0, 9);
$c = mt_rand(0, 9);
$d = mt_rand(0, 9);
$e = mt_rand(0, 9);
$f = mt_rand(0, 26);
$g = mt_rand(0, 26);
$h = mt_rand(0, 26);
$i = mt_rand(0, 26);
$j = mt_rand(0, 26);
$motaleatoire = $a.$tablettre[$f].$b.$tablettre[$g].$c.$tablettre[$h].$d.$tablettre[$i].$e.$tablettre[$j];
echo 'Votre adresse e-mail '.$mail.' existe dans nos tables et un mail de vérification vient de vous être envoyé.<br /><br />Consultez votre boîte mail, des explications vous seront fournies.';
$message = '<h5>Bonjour !<br>Vous avez demandé à redéfinir votre mot de passe. Veuillez cliquer sur le lien de vérification ci-dessous afin qu\'un nouveau mot de passe soit défini.<br><br></h5><a>http://www.votre-site.com/verif_mdp.php?e='.$mail.'&v='.$motaleatoire.'</a><br><br><br><h6>Ce mail a été envoyé automatiquement, veuillez ne pas y répondre.<br>Si ce mail vous a été envoyé alors que vous n\'en avez pas fait la demande, ne vous inquiétez pas, personne à part vous ne pourra redéfinir votre mot de passe.</h6>';
$message = '<html><head></head><body>' . $message . '</body></html>';
$sujet = 'webmaster de votre-site.com : Mail de vérification';
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$headers .= 'From: vous@votre-site.com';
mail($mail, $sujet, $message, $headers);
mysql_query('UPDATE membres SET verif="' . $motaleatoire . '" WHERE mail="' . $mail .'"') OR DIE (mysql_error());
}
else
{
?>
<h3><span style=\'color:red\'>ERREUR : Votre adresse mail n\'existe pas dans la table.</span></h3><br /><!-- écriture de l'erreur -->
<form method="post" action="./oublie_mdp.php">
<input type="text" name="email">
<input type="submit" value="Envoyer les informations">
</form>
<?php
}
}
else
{
?>
<form method="post" action="./oublie_mdp.php">
<input type="text" name="email">
<input type="submit" value="Envoyer les informations">
</form>
<?php
}
?>
|
Nous voici dans la deuxième partie de ce tutoriel !
Le mail a été envoyé, un "mot" aléatoire a été ajouté dans le champ
verif sur la ligne du membre ; maintenant, le membre clique sur le lien fourni dans le mail, il tombe sur la page
verif_mdp.php. Que fait-on ensuite ?
Eh bien, on commence par utiliser nos variables "
e" et "
v" ! Vous vous en souvenez ? "
e" pour e-mail, et "v" pour vérification.
Étant donné qu'un "mot" aléatoire a été stocké dans le champ
vérif sur la ligne du membre dans la table, et que ce mot est bel et bien "aléatoire", eh bien on peut être sûrs que seul un "mot" aléatoire ne correspond à l'adresse e-mail située dans la même entrée !
Donc, si dans la table je prends mon adresse (
ch_67_89@msn.com), je peux être sûr qu'elle sera la seule à comporter le "mot" aléatoire
0t8a9m0e5h (par exemple).
Et vice versa ! Si je prends dans la table le "mot" aléatoire
0t8a9m0e5h, seule l'adresse e-mail
ch_67_89@msn.com sera sur la même ligne. Car la probabilité pour que deux "mots" aléatoires générés soient identiques est vraiment
très très très faible. Surtout dans une période de temps donnée (le temps qu'il récupère le mail et qu'il clique sur le lien).
Page verif_mdp.php
Alors maintenant, on va juste vérifier dans un premier temps que les variables -récupérées de l'adresse par
$_GET['e'] et
$_GET['v']- existent bien et ne sont pas vides (auquel cas on met un message d'erreur).
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12 | <?php
if((isset($_GET['e'])) && (isset($_GET['v'])) && (!(empty($_GET['e']))) && (!(empty($_GET['v']))))
{
// Le code ici...
}
else
{
echo 'Le lien qui vous a été fourni est périmé.<br />':
}
?>
|
On continue en sécurisant les deux variables :
Code : PHP1
2
3
4 | <?php
$mail = htmlspecialchars($_GET['e'], ENT_QUOTES);
$verif = htmlspecialchars($_GET['v'], ENT_QUOTES);
?>
|
De la même manière que tout à l'heure pour vérifier si le mail existe, on vérifie à nouveau s'il existe une entrée dans la table
membres comportant dans le champ
mail ==>
$mail, et dans le champ
verif ==>
$verif :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | <?php
if((isset($_GET['e'])) && (isset($_GET['v'])) && (!(empty($_GET['e']))) && (!(empty($_GET['v']))))
{
$mail = htmlspecialchars($_GET['e'], ENT_QUOTES);
$verif = htmlspecialchars($_GET['v'], ENT_QUOTES);
$nombremail = mysql_result(mysql_query("SELECT COUNT(*) FROM membres WHERE mail = '".$mail."' AND verif ='".$verif."'"), 0);
}
else
{
echo 'Le lien qui vous a été fourni est périmé.<br />':
}
?>
|
Si
$nombremail est bien différente de "0", on continue ; sinon, on affiche un message d'erreur :
Code : PHP 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 | <?php
if((isset($_GET['e'])) && (isset($_GET['v'])) && (!(empty($_GET['e']))) && (!(empty($_GET['v']))))
{
$mail = htmlspecialchars($_GET['e'], ENT_QUOTES);
$verif = htmlspecialchars($_GET['v'], ENT_QUOTES);
$nombremail = mysql_result(mysql_query("SELECT COUNT(*) FROM membres WHERE mail = '".$mail."' AND verif ='".$verif."'"), 0);
if ($nombremail!= 0)
{
// Le code ici...
}
else
{
echo '<h3><span style=\'color:red\'>ERREUR : Votre adresse e-mail n\'existe pas dans la table ou le code de vérification est faux.</span></h3><br />';
}
}
else
{
echo 'Le lien qui vous a été fourni est périmé.<br />':
}
?>
|
Maintenant, exactement de la même manière que tout à l'heure, on va générer un "mot" aléatoire qui servira cette fois de mot de passe et non de "vérification".
Je commence par créer un array avec l'alphabet, j'initialise la fonction php "aléatoire", je crée mes dix variables, et je concatène le tout dans une seule. Rien de neuf :
Code : PHP 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
if((isset($_GET['e'])) && (isset($_GET['v'])) && (!(empty($_GET['e']))) && (!(empty($_GET['v']))))
{
$mail = htmlspecialchars($_GET['e'], ENT_QUOTES);
$verif = htmlspecialchars($_GET['v'], ENT_QUOTES);
$nombremail = mysql_result(mysql_query("SELECT COUNT(*) FROM membres WHERE mail = '".$mail."' AND verif ='".$verif."'"), 0);
if ($nombremail!= 0)
{
$tablettre = array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z");
mt_srand((float) microtime()*10000);
$a = mt_rand(0, 9);
$b = mt_rand(0, 9);
$c = mt_rand(0, 9);
$d = mt_rand(0, 9);
$e = mt_rand(0, 9);
$f = mt_rand(0, 26);
$g = mt_rand(0, 26);
$h = mt_rand(0, 26);
$i = mt_rand(0, 26);
$j = mt_rand(0, 26);
$nouveaumdp = $a.$tablettre[$f].$b.$tablettre[$g].$c.$tablettre[$h].$d.$tablettre[$i].$e.$tablettre[$j];
...
}
else
{
echo '<h3><span style=\'color:red\'>ERREUR : Votre adresse e-mail n\'existe pas dans la table ou le code de vérification est faux.</span></h3><br />';
}
}
else
{
echo 'Le lien qui vous a été fourni est périmé.<br />':
}
?>
|
Maintenant j'insère le message du succès, et je continue :
Code : PHP1
2
3 | <?php
echo 'Votre compte comportant l\'adresse e-mail '.$mail.' vient de subir une redéfinition de mot de passe.<br />Un e-mail comportant votre nouveau mot de passe vous a été envoyé. Veuillez consulter votre boîte mail, des explications vous seront fournies.';
?>
|
Je crée la variable
$message qui sera envoyée plus bas dans la fonction
mail. Ce message contiendra un petit texte d'indication, ainsi que le nouveau mot de passe généré à peine plus haut :
Code : PHP1
2
3 | <?php
$message = '<h5>Bonjour '.$pseudomembre.' !<br>Ce mail contient votre nouveau mot de passe. Veuillez vous connecter sur <a href="http://www.votre-site.com/">Votre site</a> avec ce nouveau mot de passe.<br /><br />Votre nouveau mot de passe est : '.$nouveaumdp.'</h5><br><br><br><h6>Ce mail a été envoyé automatiquement, veuillez ne pas y répondre.<br>';
?>
|
On remplit les normes d'affichage pour le mail dans les différentes variables, et on envoie le tout par mail :
Code : PHP 1
2
3
4
5
6
7
8
9
10 | <?php
$message = '<html><head></head><body>' . $message . '</body></html>';
$sujet = 'webmaster de irislbp.free.fr : Votre mot de passe';
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$headers .= 'From: vous@votre-site.com';
mail($mail, $sujet, $message, $headers);
?>
|
Et on n'oublie pas de mettre à jour le champ
mdp de la table après avoir crypté
$nouveaumdp via la fonction
md5(). On met aussi le champ
verif à "0" pour éviter les ambiguïtés par la suite, au cas où un autre membre fait la même démarche que le premier et se voit attribuer un "mot" de vérification identique à celui déjà généré plus tôt ! (Ça limite encore plus les probabilités d'égalité.)
Code : PHP1
2
3
4 | <?php
$passcrypt=md5($nouveaumdp);
mysql_query('UPDATE membres SET mdp="' . $passcrypt . '", verif="0" WHERE mail="' . $mail .'"') OR DIE (mysql_error());
?>
|
Voilà ! C'est terminé! Ça nous donne quelque chose comme ceci :
verif_mdp.php
Code : PHP 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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 | <?php
if((isset($_GET['e'])) && (isset($_GET['v'])) && (!(empty($_GET['e']))) && (!(empty($_GET['v']))))
{
$mail = htmlspecialchars($_GET['e'], ENT_QUOTES);
$verif = htmlspecialchars($_GET['v'], ENT_QUOTES);
$nombremail = mysql_result(mysql_query("SELECT COUNT(*) FROM membres WHERE mail = '".$mail."' AND verif ='".$verif."'"), 0);
if ($nombremail!= 0)
{
$tablettre = array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z");
mt_srand((float) microtime()*10000);
$a = mt_rand(0, 9);
$b = mt_rand(0, 9);
$c = mt_rand(0, 9);
$d = mt_rand(0, 9);
$e = mt_rand(0, 9);
$f = mt_rand(0, 26);
$g = mt_rand(0, 26);
$h = mt_rand(0, 26);
$i = mt_rand(0, 26);
$j = mt_rand(0, 26);
$nouveaumdp = $a.$tablettre[$f].$b.$tablettre[$g].$c.$tablettre[$h].$d.$tablettre[$i].$e.$tablettre[$j];
echo 'Votre compte comportant l\'adresse e-mail '.$mail.' vient de subir une redéfinition de mot de passe.<br />Un e-mail comportant votre nouveau mot de passe vous a été envoyé. Veuillez consulter votre boîte mail, des explications vous seront fournies.';
$message = '<h5>Bonjour '.$pseudomembre.' !<br>Ce mail contient votre nouveau mot de passe. Veuillez vous connecter sur <a href="http://irislbp.free.fr/">Irislbp</a> avec ce nouveau mot de passe. Il vous sera bientôt possible de le modifier.<br /><br />Votre nouveau mot de passe est : '.$nouveaumdp.'</h5><br><br><br><h6>Ce mail a été envoyé automatiquement, veuillez ne pas y répondre.<br>';
$message = '<html><head></head><body>' . $message . '</body></html>';
$sujet = 'webmaster de irislbp.free.fr : Votre mot de passe';
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$headers .= 'From: vous@votre-site.com';
mail($mail, $sujet, $message, $headers);
$passcrypt=md5($nouveaumdp);
mysql_query('UPDATE membres SET mdp="' . $passcrypt . '", verif="0" WHERE mail="' . $mail .'"') OR DIE (mysql_error());
}
else
{
echo '<h3><span style=\'color:red\'>ERREUR : Votre adresse email n\'existe pas dans la table ou le code de vérification est faux.</span></h3><br />';
}
}
else
{
echo 'Le lien qui vous a été fourni est périmé.<br />':
}
?>
|