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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 91
    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 confirmé
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 91
    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 Expert
    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 : 56
    Localisation : France

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

    Informations forums :
    Inscription : Août 2005
    Messages : 1 203
    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 confirmé
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 91
    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
    Membre Expert
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 495
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 495
    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 confirmé
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

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

  7. #7
    Membre Expert
    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 : 56
    Localisation : France

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

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

    Il te faudra bien comparer 2 hashages.

+ Répondre à la discussion
Cette discussion est résolue.

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