Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/01/2012, 15h24   #1
Invité de passage
 
Inscription : janvier 2012
Messages : 27
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 27
Points : 2
Points : 2
Par défaut Validation nouveau mot de passe

Bien le bonjour tout le monde,

utilisant PHP depuis peu, je souhaiterais savoir comment faire pour générer un lien envoyé par e-mail qui active un mot de passe généré aléatoirement.

J'ai déjà l'envoi de l'e-mail du nouveau mot de passe, mais l'update se fait tout seul dans la base de donnée. Donc, comment faire pour générer un lien permettant l'éxécution de la requête sql ?

Au plaisir de vous lire.
Spire_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 23h25   #2
Invité de passage
 
Inscription : janvier 2012
Messages : 27
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 27
Points : 2
Points : 2
Bonsoir,

j'y suis presque.
Désormais, lorsqu'un membre entre son adresse e-mail dans "mot de passe oublié", celui-ci reçoit dans sa messagerie un lien de confirmation permettant d'activer un mot de passe généré aléatoirement. Ce mot de passe est aussi envoyé par e-mail.

Le hic, c'est que dès qu'une personne entre http://www.lesite.com/repertoire/con...essse@mail.com dans l'url, ceci active directement un mot de passe à la personne à qui appartient l'adresse e-mail.

Le lien de confirmation est sous cette forme:
http://www.lesite.com/repertoire/con..._md5_aleatoire.

Le code de confirmation:

Code :
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
/* Connexion à la base de donnée MySql. */
include ('../mysql/connection_mysql.php');
 
/* Attribuer des petits mots pour le lien de validation. */
$email = $_GET['ema'];
$code = $_GET['code'];
 
/* Récupérer la clé générée aléatoirement. */
$sql_code = "SELECT code, email FROM users WHERE email = '$email'";
$result_code = mysql_query($sql_code) or die("Erreur SQL :  " . mysql_error());
$data_code = mysql_fetch_assoc($result_code);
 
if ($code != mysql_num_rows($result_code))
     {
 
         /* Générer un nouveau mot de passe. */
         include ('./function_new_password.php');
 
   		 /* Sélectionner pseudo correspondant pour l'envoi du nouveau mot de passe. */
		 $sql_nickname = "SELECT nickname FROM users WHERE email = '$email'";
		 $result_nickname = mysql_query($sql_nickname) or die("Erreur SQL :  " . mysql_error());
		 $data_nickname = mysql_fetch_assoc($result_nickname);
 
	     /* Mettre à jour le mot de passe. */
		 $sql_maj_password = "UPDATE users SET password = MD5('$new_password') WHERE email = '$email'";
		 mysql_query($sql_maj_password);
 
		 /* Envoyer le nouveau mot de passe par e-mail, car le lien de confirmation a été cliqué et est valide. */
		 include ('./send_new_password_email.php');
 
         /* Informer l'internaute du bon déroulement. */	
         echo '<img src="../images/success.gif" /><font color="green">Succès: Un nouveau mot de passe vient de vous être envoyé</font>.';
     }
 
else
	 {
		 echo '<img src="../images/error.gif" /><font color="red">Erreur: Ce lien n\'est pas valide</font>.';
	 }
	 		 /* Fermer la connexion MySql. */
         mysql_close();
 
?>
Au plaisir de vous lire. (:
Spire_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 00h43   #3
Membre Expert
 
Avatar de ska_root
 
Homme
Développeur informatique
Inscription : août 2005
Messages : 1 179
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Service public

Informations forums :
Inscription : août 2005
Messages : 1 179
Points : 1 580
Points : 1 580
Bonsoir,

il faut que :
-tu utilises un hash (md5, sha ou autre) pour crypter l'adresse email dans ton lien
-dans la page de génération, tu décryptes le hash pour générer le nouveau MDP et l'associer a l'email dans la base
-tu supprimes le hash dans la base de données

__________________
http://cdemarche.developpez.com/

Tu as la réponse à ta question ? N'oublies pas le petit en bas à gauche de ton message...
ska_root est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 00h56   #4
Invité de passage
 
Inscription : janvier 2012
Messages : 27
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 27
Points : 2
Points : 2
Merci de ta réponse.

J'ai procédé à un nouveau système que voici.

La personne entre son adresse e-mail dans mot de passe oublié.
Un e-mail lui ai envoyé avec son nouveau mot de passe et un lien de confirmation. Si elle clique sur le lien de confirmation, le nouveau mot de passe remplace l'ancien.

Le hic, c'est que le problème est presque le même. Si une personne entre l'adresse e-mail d'une autre dans mot de passe oublié, ceci va générer un nouveau mot de passe sans le remplacer. La personne n'a plus qu'à entrer un lien comme dit sur mon message précédent, et hop son mot de passe sera changé.
Mais le code est plus simple.

Comment faire pour décrypter un hashage sachant que c'est irréversible ?

Le nouveau code:

send_password.php:
Code :
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
68
69
70
71
72
73
74
75
<?php
/* Connexion à la base de donnée MySql. */
include ('./mysql/connection_mysql.php');	
 
/* Récupérer les informations données dans les champs. */
include ('./includes/recup_field.php'); 
 
/* Vérifier si les champs sont vides. */ 
if (empty($email))
	 { 
         echo '<img src="./images/error.gif" /><font color="red">Erreur: Vous devez indiquer votre adresse électronique</font>.';
		 include ('./password.php');
		 exit;
     }
 
/* Aucun champ n'est vide, exécution des requêtes Sql. */
else      
     {			
		 $sql_email = "SELECT email FROM users WHERE email = '$email'";
	     $result_email = mysql_query($sql_email) or die("Erreur SQL :  " . mysql_error());
		 $data_email = mysql_fetch_assoc($result_email);
 
		 /* Vérifier si l'adresse électronique est présente dans la base de données. */
		 if ($data_email['email'] != $email)
			 {
				 echo '<img src="./images/error.gif" /><font color="red">Erreur: Cette adresse électronique n\'est pas reconnue par notre base de données</font>.';
				 include ('./password.php');
		         exit;
		     }
		 else
			 {
			     /* Sélectionner le pseudo correspondant à l'adresse e-mail entrée. */
			     $sql_nickname = "SELECT nickname FROM users WHERE email = '$email'";
		         $result_nickname = mysql_query($sql_nickname) or die("Erreur SQL :  " . mysql_error());
			     $data_nickname = mysql_fetch_assoc($result_nickname);
 
				 /* Sélectionner le mot de passe correspondant à l'adresse e-mail entrée. */
		         $sql_password = "SELECT password FROM users WHERE email = '$email'";
		         $result_password = mysql_query($sql_password) or die("Erreur SQL :  " . mysql_error());
		         $data_password = mysql_fetch_assoc($result_password);
 
				 /* Générer la clé de confirmation du changement de mot de passe. */
				 $code = md5(uniqid(rand(), true));
 
				 /* Mettre à jour la clé de confirmation dans la base de données. */
				 $sql_code = "UPDATE users SET code = '$code' WHERE email = '$email'";
                 mysql_query($sql_code);
 
				 /* Générer un nouveau mot de passe. */
                 include ('./forget/function_new_password.php');
 
				 /* Implémenter le nouveau mot de passe sans le remplacer pour le moment. */
		         $sql_new_password = "UPDATE users SET new_password = MD5('$new_password') WHERE email = '$email'";
		         mysql_query($sql_new_password);
 
				 /* Envoyer l'e-mail contenant le lien de confirmation. */
				 include ('./forget/send_confirmation.php');
 
				 if (!mail($email, $subject, /*$data_password['password']*/ $new_password, $headers))
				     {
                         echo '<img src="./images/error.gif" /><font color="red">Erreur: Problème lors de l\'envoi de l\'e-mail</font>.';
						 include ('./password.php');
		                 exit;
					 }
 
				 /* Informer l'internaute du bon déroulement. */
                 echo '<img src="./images/success.gif" /><font color="green">Succès: Un e-mail de confirmation vous a été envoyé</font>. <a href="./login.php">Cliquez ici</a> pour vous connecter.';
                 include ('./password.php');
                 exit;
 
	             /* Fermer la connexion MySql. */
                  mysql_close();
	   	     }
	 }
?>
send_confirmation.php:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
/* Envoyer l'e-mail contenant le lien de confirmation. */
$subject = 'Confirmation d\'un nouveau mot de passe';
$message = 'Vous avez demandé un nouveau mot de passe. <br />
		    Pour confirmer cette demande, veuillez cliquez sur le lien ci-dessous. <br />
			<br />Si vous n\êtes pas à l\'origine de cette demande, ne cliquez pas. <br />
			<strong>Pseudo: </strong>' . htmlentities($data_nickname['nickname']) .
			'<br /><strong>Nouveau mot de passe: </strong>' . htmlentities($new_password) .
			'<br />http://perso-spire.site40.net/forget/confirmation.php?ema='.urlencode($email).'&cod='.urlencode($code).'';
$recipient = htmlentities($_POST['email']);
$headers = "From: \"Webmaster\"<moi@domaine.com>\n";
$headers .= "Content-type: text/html; charset=utf-8";
mail($recipient, $subject, $message, $headers);
?>
confirmation.php:
Code :
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
/* Connexion à la base de donnée MySql. */
include ('../mysql/connection_mysql.php');
 
/* Attribuer des petits mots pour le lien de validation. */
$email = $_GET['ema'];
$code = $_GET['cod'];
 
/* Récupérer la clé générée aléatoirement. */
$sql_code = "SELECT code, email FROM users WHERE email = '$email'";
$result_code = mysql_query($sql_code) or die("Erreur SQL :  " . mysql_error());
$data_code = mysql_fetch_assoc($result_code);
 
$sql_new_old_password = "SELECT email FROM users WHERE password = new_password";
$result_new_old_password = mysql_query($sql_code) or die("Erreur SQL :  " . mysql_error());
 
if ($email == mysql_num_rows($result_new_old_password))
     {
		 echo '<img src="../images/error.gif" /><font color="red">Erreur: Ce lien n\'est plus valide</font>.';
	 }
 
else
     {   
	     /* Remplacer le mot de passe perdu par le nouveau. */
		 $sql_maj_password = "UPDATE users SET password = new_password WHERE email = '$email'";
		 mysql_query($sql_maj_password);
 
         /* Informer l'internaute du bon déroulement. */	
         echo '<img src="../images/success.gif" /><font color="green">Succès: Votre mot de passe a été changé</font>. <a href="../login.php">Cliquez-ici</a> pour vous connecter avec le nouveau mot de passe.';
     }
 
/* Fermer la connexion MySql. */
mysql_close();
 
?>
Spire_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 01h04   #5
Membre Expert
 
Avatar de Doksuri
 
Tiger Scott
Développeur Web
Inscription : juin 2006
Messages : 1 250
Détails du profil
Informations personnelles :
Nom : Tiger Scott
Âge : 42

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juin 2006
Messages : 1 250
Points : 1 514
Points : 1 514
Citation:
Envoyé par ska_root Voir le message
Bonsoir,

il faut que :
-tu utilises un hash (md5, sha ou autre) pour crypter l'adresse email dans ton lien
-dans la page de génération, tu décryptes le hash pour générer le nouveau MDP et l'associer a l'email dans la base
-tu supprimes le hash dans la base de données

pour ne pas embrouiller les gens, petit rappel =)
hash != crypt
cryptage = decryptage = re lisible
hash = impossible a "dehasher" = a jamais illisible
__________________
La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

N'oubliez pas le Le tag resolu.

Need_!
Doksuri est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 01h09   #6
Invité de passage
 
Inscription : janvier 2012
Messages : 27
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 27
Points : 2
Points : 2
D'accord, je crois comprendre.
Donc décrypter serait comparer deux chaînes cryptées c'est ça ?
Spire_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 01h18   #7
Membre Expert
 
Avatar de ska_root
 
Homme
Développeur informatique
Inscription : août 2005
Messages : 1 179
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Service public

Informations forums :
Inscription : août 2005
Messages : 1 179
Points : 1 580
Points : 1 580
oui en effet, j'induis en erreur...

Il te faudra bien comparer 2 hashages.
__________________
http://cdemarche.developpez.com/

Tu as la réponse à ta question ? N'oublies pas le petit en bas à gauche de ton message...
ska_root est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 14h15   #8
Membre chevronné
 
Avatar de Marc3001
 
Homme
Ingénieur développement logiciels
Inscription : février 2008
Messages : 430
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : février 2008
Messages : 430
Points : 682
Points : 682
Quitte à utiliser un hash dans le lien, utilise un jeton généré aléatoirement. Ca évitera tout risque de hack.

Lors de la demande de nouveau pass, tu génère un jeton que tu stockes en base. Tu envoies ton mail avec le lien avec le jeton.

Si la personne clique sur le lien, tu actives le jeton qui dans la base est lié au bon user. Tu génères ton nouveau pass et tu supprimes le jeton.

Tu peux aussi mettre un timestamp en base avec le jeton et du coup lui donner une durée de vie restreinte.
__________________
Le logiciel, c'est comme le sexe, c'est meilleur quand c'est libre.

Linus Torvalds
Marc3001 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 16h20   #9
Invité de passage
 
Inscription : janvier 2012
Messages : 27
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 27
Points : 2
Points : 2
Merci pour ces réponses.

Je suis en train de mettre en place un système de jeton.
Je vous tiens au courant par la suite. (:
Spire_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 20h17   #10
Invité de passage
 
Inscription : janvier 2012
Messages : 27
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 27
Points : 2
Points : 2
Veuillez m'excuser du double post.

Voila, tout est bon, le système de jeton est en place et opérationnel.

Cependant, comment faire pour imposer un délais comme tu dis Marc ?

Je génère mon jeton comme ceci:

Code :
$_SESSION['token'] = md5(uniqid(rand(), true));
Amicalement.
Spire_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 18h59   #11
Membre chevronné
 
Avatar de Marc3001
 
Homme
Ingénieur développement logiciels
Inscription : février 2008
Messages : 430
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : février 2008
Messages : 430
Points : 682
Points : 682
Par délai tu veux dire durée de vie de la session?

Si c'est ça tu peux si l'utilisateur tente d'utiliser un jeton (clique sr le lien dans le mail) checker en plus de l'éxistence du jeton, le diff entre la date de création du jeton en base et la date actuelle.
Si c'est OK tuvalides l'init du MDP sinon tu fais comme si le jeton n'était pas valide.
__________________
Le logiciel, c'est comme le sexe, c'est meilleur quand c'est libre.

Linus Torvalds
Marc3001 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 21h23   #12
Invité de passage
 
Inscription : janvier 2012
Messages : 27
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 27
Points : 2
Points : 2
Oui par rapport à la durée de la session.

Mais je ne vois pas comment mettre en base une date au jeton.
Spire_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 21h56   #13
Membre chevronné
 
Avatar de Marc3001
 
Homme
Ingénieur développement logiciels
Inscription : février 2008
Messages : 430
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : février 2008
Messages : 430
Points : 682
Points : 682
Dans ta base, j'imagine que tu as créé une table avec un champs qui contient la chaîne du jeton.
Dans cette table, tu rajoute un nouveau champ qui contiendra la date de création du jeton.

Ca donnera un truc de ce genre :

Table Jeton:
Champs valeur (contient le hash généré aléatoirement)
Champs dateCreation (contient la date de création du jeton)
__________________
Le logiciel, c'est comme le sexe, c'est meilleur quand c'est libre.

Linus Torvalds
Marc3001 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 23h25   #14
Invité de passage
 
Inscription : janvier 2012
Messages : 27
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 27
Points : 2
Points : 2
Ah oui je vois.

Le truc, c'est que je n'utilise pas ma base pour les jetons. J'utilise juste les sessions. (:
Spire_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 13h12   #15
Membre chevronné
 
Avatar de Marc3001
 
Homme
Ingénieur développement logiciels
Inscription : février 2008
Messages : 430
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : février 2008
Messages : 430
Points : 682
Points : 682
Ah j'ai un doute sur la compréhension de la solution.

Où stockes-tu le jeton?
Si nulle part, comment fais-tu le lien entre le jeton utilisé par le user et son id ou email?
__________________
Le logiciel, c'est comme le sexe, c'est meilleur quand c'est libre.

Linus Torvalds
Marc3001 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 20h27   #16
Invité de passage
 
Inscription : janvier 2012
Messages : 27
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 27
Points : 2
Points : 2
Le truc, c'est que je compare le lien envoyé avec des sessions et le lien lorsque la personne clique, à l'aide d'un get.

Voici mon code:

send_password.php:
Code :
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
68
69
70
71
72
73
74
75
76
77
78
<?php
session_start();
/* Connexion à la base de donnée MySql. */
include ('./mysql/connection_mysql.php');	
 
/* Récupérer les informations données dans les champs. */
include ('./includes/recup_field.php'); 
 
/* Vérifier si les champs sont vides. */ 
if (empty($email))
	 { 
         echo '<img src="./images/error.gif" /><font color="red">Erreur: Vous devez indiquer votre adresse électronique</font>.';
		 include ('./password.php');
		 exit;
     }
 
/* Aucun champ n'est vide, exécution des requêtes Sql. */
else      
     {			
		 $sql_email = "SELECT email FROM users WHERE email = '$email'";
	     $result_email = mysql_query($sql_email) or die("Erreur SQL :  " . mysql_error());
		 $data_email = mysql_fetch_assoc($result_email);
 
		 /* Vérifier si l'adresse électronique est présente dans la base de données. */
		 if ($data_email['email'] != $email)
			 {
				 echo '<img src="./images/error.gif" /><font color="red">Erreur: Cette adresse électronique n\'est pas reconnue par notre base de données</font>.';
				 include ('./password.php');
		         exit;
		     }
		 else
			 {
			     /* Sélectionner le pseudo correspondant à l'adresse e-mail entrée. */
			     $sql_nickname = "SELECT nickname FROM users WHERE email = '$email'";
		         $result_nickname = mysql_query($sql_nickname) or die("Erreur SQL :  " . mysql_error());
			     $data_nickname = mysql_fetch_assoc($result_nickname);
 
				 /* Sélectionner le mot de passe correspondant à l'adresse e-mail entrée. */
		         $sql_password = "SELECT password FROM users WHERE email = '$email'";
		         $result_password = mysql_query($sql_password) or die("Erreur SQL :  " . mysql_error());
		         $data_password = mysql_fetch_assoc($result_password);
 
				 /* Générer un nouveau mot de passe. */
                 include ('./forget/function_new_password.php');
 
				 /* Implémenter le nouveau mot de passe sans le remplacer pour le moment. */
		         $sql_new_password = "UPDATE users SET new_password = MD5('$new_password') WHERE email = '$email'";
		         mysql_query($sql_new_password);
 
				 /* Transformer le POST en SESSION pour la vérification du lien de validation du changement de mot de passe. */
				 $_SESSION['email'] = $_POST['email'];
 
				 /* Générer le code de confirmation du changement de mot de passe. */
				 $_SESSION['code'] = md5(uniqid(rand(), true));
 
				 /* Générer le jeton de confirmation du changement de mot de passe. */
				 $_SESSION['token'] = md5(uniqid(rand(), true));
 
				 /* Envoyer l'e-mail contenant le lien de confirmation. */
				 include ('./forget/send_confirmation.php');
 
				 if (!mail($email, $subject, /*$data_password['password']*/ $new_password, $headers))
				     {
                         echo '<img src="./images/error.gif" /><font color="red">Erreur: Problème lors de l\'envoi de l\'e-mail</font>.';
						 include ('./password.php');
		                 exit;
					 }
 
				 /* Informer l'internaute du bon déroulement. */
                 echo '<img src="./images/success.gif" /><font color="green">Succès: Un e-mail de confirmation vous a été envoyé</font>. <a href="./login.php">Cliquez ici</a> pour vous connecter.';
                 include ('./password.php');
                 exit;
 
	             /* Fermer la connexion MySql. */
                  mysql_close();
	   	     }
	 }
?>
send_confirmation.php:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
session_start();
/* Envoyer l'e-mail contenant le lien de confirmation. */
$subject = 'Confirmation d\'un nouveau mot de passe';
$message = 'Vous avez demandé un nouveau mot de passe. <br />
		    Pour confirmer cette demande, veuillez cliquez sur le lien ci-dessous. <br />
			<br />Si vous n\êtes pas à l\'origine de cette demande, ne cliquez pas. <br />
			<strong>Pseudo: </strong>' . htmlentities($data_nickname['nickname']) .
			'<br /><strong>Nouveau mot de passe: </strong>' . htmlentities($new_password) .
			'<br />http://perso-spire.site40.net/forget/confirmation.php?ema='.urlencode(htmlentities($email)).'&cod='.htmlentities($_SESSION['code']).'&jet='.htmlentities($_SESSION['token']).'';
$recipient = htmlentities($_POST['email']);
$headers = "From: \"Webmaster\"<moi@domaine.com>\n";
$headers .= "Content-type: text/html; charset=utf-8";
mail($recipient, $subject, $message, $headers);
?>
confirmation.php:
Code :
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
<?php
session_start();
/* Connexion à la base de donnée MySql. */
include ('../mysql/connection_mysql.php');
 
/* Attribuer une variable pour éviter les conflicts avec le formulaire. */
$email = $_GET['ema'];
 
/* Vérifier si le jeton, le code et l'adresse électronique ne sont pas vides. */
if (empty($_SESSION['token']) OR empty($_SESSION['code']) OR empty($email))
	 {
         echo '<img src="../images/error.gif" /><font color="red">Erreur: Ce lien n\'est pas valide</font>.';
	 }
 
/* Vérifier si le jeton, le code et l'adresse électronique correspondent à ceux envoyés dans l'email. */
else if ($_SESSION['token'] == $_GET['jet'] && $_SESSION['code'] == $_GET['cod'] && $_SESSION['email'] == $_GET['ema'])
     {
	     /* Remplacer le mot de passe perdu par le nouveau. */
		 $sql_maj_password = "UPDATE users SET password = new_password WHERE email = '$email'";
		 mysql_query($sql_maj_password);
 
         /* Informer l'internaute du bon déroulement. */	
         echo '<img src="../images/success.gif" /><font color="green">Succès: Votre mot de passe a été changé</font>. <a href="../login.php">Cliquez-ici</a> pour vous connecter avec le nouveau mot de passe.';
     }
else
     {
         echo '<img src="../images/error.gif" /><font color="red">Erreur: Ce lien n\'est pas valide</font>.';
	 }
 
/* Fermer la connexion MySql. */
mysql_close();
?>
Spire_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 08h50   #17
Membre chevronné
 
Avatar de Marc3001
 
Homme
Ingénieur développement logiciels
Inscription : février 2008
Messages : 430
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : février 2008
Messages : 430
Points : 682
Points : 682
Tu as un problème dans confirmation.php.

Tu ne dois pas vérifier que la session contient le token.
Pourquoi? Parceque cela veux dire que l'utilisateur doit utiliser le lien dans les X minutes après avoir demandé le reinit du MDP et sur le même navigateur (sans l'avoir fermé).

Ca paraît un peu contraignant et il n'y a plus l'utilité d'utiliser un token vu que tu utilises la session php.

L'idée c'était plutot de stocker ton token en BDD. Quand un utilisateur clique sur le lien tu vas vérifier que le token est valide en BDD et si oui tu valorises les variables de sessions avec les infos du user.
Faut bien comprendre que l'utilisateur qui clique sur le lien peux n'avoir aucune donnée de session au moment où il clique sur le lien. C'est le token dans l'url qui garantie la sécurité.
__________________
Le logiciel, c'est comme le sexe, c'est meilleur quand c'est libre.

Linus Torvalds
Marc3001 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 09h15   #18
Invité de passage
 
Inscription : janvier 2012
Messages : 27
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 27
Points : 2
Points : 2
Merci encore pour cette réponse.

Mais le système que j'ai actuellement est aussi sécurisé non ?
Spire_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 09h33   #19
Membre chevronné
 
Avatar de Marc3001
 
Homme
Ingénieur développement logiciels
Inscription : février 2008
Messages : 430
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : février 2008
Messages : 430
Points : 682
Points : 682
Ce qui est dommage c'est que si la personne reçoit le mail pour reinit le password, elle devra obligatoirement cliquer sur le lien rapidement.....

C'est pas un problème de sécurité mais c'est contraignant.
__________________
Le logiciel, c'est comme le sexe, c'est meilleur quand c'est libre.

Linus Torvalds
Marc3001 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 10h32   #20
Invité de passage
 
Inscription : janvier 2012
Messages : 27
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 27
Points : 2
Points : 2
Oui j'y réfléchirai merci.

Et ce n'ai pas possible justement d'augmenter/réduire le temps ?
Spire_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h28.


 
 
 
 
Partenaires

Hébergement Web