IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Validation nouveau mot de passe [PHP 5.1]


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 91
    Points : 51
    Points
    51
    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.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 91
    Points : 51
    Points
    51
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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. (:

  3. #3
    Membre chevronné
    Avatar de ska_root
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

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

    Informations forums :
    Inscription : Août 2005
    Messages : 1 203
    Points : 1 839
    Points
    1 839
    Par défaut
    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


  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 91
    Points : 51
    Points
    51
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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();
     
    ?>

  5. #5
    Expert confirmé
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 451
    Points : 4 600
    Points
    4 600
    Par défaut
    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.

    Venez discuter sur le Chat de Développez !

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 91
    Points : 51
    Points
    51
    Par défaut
    D'accord, je crois comprendre.
    Donc décrypter serait comparer deux chaînes cryptées c'est ça ?

  7. #7
    Membre chevronné
    Avatar de ska_root
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

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

    Informations forums :
    Inscription : Août 2005
    Messages : 1 203
    Points : 1 839
    Points
    1 839
    Par défaut
    oui en effet, j'induis en erreur...

    Il te faudra bien comparer 2 hashages.

  8. #8
    Membre éprouvé Avatar de Marc3001
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2008
    Messages
    829
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2008
    Messages : 829
    Points : 1 275
    Points
    1 275
    Par défaut
    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

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 91
    Points : 51
    Points
    51
    Par défaut
    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. (:

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 91
    Points : 51
    Points
    51
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $_SESSION['token'] = md5(uniqid(rand(), true));
    Amicalement.

  11. #11
    Membre éprouvé Avatar de Marc3001
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2008
    Messages
    829
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2008
    Messages : 829
    Points : 1 275
    Points
    1 275
    Par défaut
    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

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 91
    Points : 51
    Points
    51
    Par défaut
    Oui par rapport à la durée de la session.

    Mais je ne vois pas comment mettre en base une date au jeton.

  13. #13
    Membre éprouvé Avatar de Marc3001
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2008
    Messages
    829
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2008
    Messages : 829
    Points : 1 275
    Points
    1 275
    Par défaut
    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

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 91
    Points : 51
    Points
    51
    Par défaut
    Ah oui je vois.

    Le truc, c'est que je n'utilise pas ma base pour les jetons. J'utilise juste les sessions. (:

  15. #15
    Membre éprouvé Avatar de Marc3001
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2008
    Messages
    829
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2008
    Messages : 829
    Points : 1 275
    Points
    1 275
    Par défaut
    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

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 91
    Points : 51
    Points
    51
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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();
    ?>

  17. #17
    Membre éprouvé Avatar de Marc3001
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2008
    Messages
    829
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2008
    Messages : 829
    Points : 1 275
    Points
    1 275
    Par défaut
    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

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 91
    Points : 51
    Points
    51
    Par défaut
    Merci encore pour cette réponse.

    Mais le système que j'ai actuellement est aussi sécurisé non ?

  19. #19
    Membre éprouvé Avatar de Marc3001
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2008
    Messages
    829
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2008
    Messages : 829
    Points : 1 275
    Points
    1 275
    Par défaut
    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

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 91
    Points : 51
    Points
    51
    Par défaut
    Oui j'y réfléchirai merci.

    Et ce n'ai pas possible justement d'augmenter/réduire le temps ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [XL-2003] Nouveau mot de passe regulièrement en Vba
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 22/06/2009, 14h42
  2. Valider un mot de passe enter et/ou bouton
    Par pictures dans le forum VB.NET
    Réponses: 3
    Dernier message: 24/05/2009, 08h28
  3. [RegEx] Validation de mots de passe
    Par Jimmy_S dans le forum Langage
    Réponses: 1
    Dernier message: 09/07/2008, 13h21
  4. Valider 2 mots de passe
    Par HWICE dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 27/07/2007, 19h05
  5. Nouveau mot de passe refusé
    Par al1_24 dans le forum Windows Serveur
    Réponses: 21
    Dernier message: 12/09/2006, 13h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo