Perte de mot de passe
Hors ligneZingwai Le 04/08/2007 à 10:04 Profil de Zingwai Configuration de Zingwai

Bonjour.

Il y a quelques temps, nous avons créés pour mon site une page de récupération de mot de passe.
Or, nous avons aussi remarqué qu'elle avait un gros défaut... Elle change en réalité non pas un mot de passe (celui qui le demande) mais le mot de passe et le code de confirmation de tout le monde.

Voici le code de récupération :
<?php
include('inc/fonctions.php');
$titre 'Mot de passe perdu';
haut($titre);

if(empty(
$_GET['confirm']))
{
     if(!empty($_POST['email']))
     {
          $email mysql_real_escape_string($_POST['email']);
          $reponse mysql_query("SELECT COUNT(*) AS verif FROM membre WHERE email = '" $email "'");
          $donnees mysql_fetch_assoc($reponse);
     
          if
($donnees['verif'] == 0)
          {
               echo'<h1>Mot de passe oublié</h1><h2>Votre adresse email est invalide.</h2>';
          }
          else
          
{
          // Génération mot de passe
          $chrs 8;
          $addchrs '';
          $letter 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'.$addchrs;
          $number strlen($letter);
          $pwd '';
          $i=0;
          while ($i++ < $chrs)
          $pwd .=  $letter[mt_rand(0,$number-1)];
          $confirmation $pwd;
     
          
// Envoi mail 
          $adresse $email;
          $sujet '[Mon site] Changement de mot de passe';
          $message '<html><body>
<p>Bonjour,<br />
Vous venez de demander un changement de pseudo sur Mon site.fr.<br />
Votre nouveau mot de passe est généré aléatoirement. Il s\'agit de : <strong>' 
$confirmation '</strong>
Si vous avez demandé un nouveau mot de passe, cliquez sur le lien suivant, sinon ignorez cette email  :<br />
<a href="http://www.monsite.fr/mdp_perdu.html?confirm=' 
$confirmation '"></a><br />
Si vous ne voyez pas le lien, copiez cette adresse dans votre navigateur :<br/><strong>http://www.monsite.fr/mdp_perdu.html?confirm=' 
$confirmation '</strong><br />
Si vous n\'avez pas demandé de changement de mot de passe, ne faites rien, votre mot de passe ne sera pas changé.<br />
Cet mail a été envoyé depuis notre serveur, surtout n\'y <strong>repondez pas</strong>, personne ne pourra vous répondre.<br />
A tout de suite sur Monsite !
</p>
</body></html>'
;

          mail($adresse,$sujet,$message,"From:  noreply@monsite.fr\r\nReply-To: $reponse\r\nContent-Type: text/html; charset=\"iso-8859-1\"\r\n");
          mysql_query("UPDATE membre SET confirmation ='" $confirmation "' ");
          echo '<h1>Mot de passe oublié</h1><h2>Un email vient de vous être envoyé.</h2>';
          }
     }
     else
     
{
?>
<h1>Mot de passe perdu</h1>
<p>Vous avez perdu votre mot de passe ?<br />
Pas de panique, pour en récupérer un autre, il suffit de remplir votre adresse email dans ce formulaire. Si le mot de passe qui va vous être envoyé ne vous conviens pas, vous pourrez le changer dans votre espace membre.<br />
Si vous avez un autre problème, que vous ne vous souvenez plus de votre pseudo ou adresse email, contactez nous et nous vous dépanerons rapidement.</p>
<p><a href="contact.html">Contactez nous</a></p>

<form action="mdp_perdu.html" method="post">
<fieldset>
          <legend><strong>Récupérer mon mot de passe</strong></legend><br /><br />
          <label for="email"><strong>Adresse email </strong></label><input type="text" name="email" id="email" size="30" /><br />
          <br /><br />
          <div style="text-align: center;"><input type="submit" name="send" value="Obtenir un nouveau mot de passe" tabindex="50" accesskey="s" /></div>
          
</fieldset>
</form>

<?php
     
}
}
else
{
     $code mysql_real_escape_string($_GET['confirm']);
     $reponse mysql_query("SELECT COUNT(*) AS verif FROM membre WHERE active = '1' AND confirmation = '" $code "'")or die(mysql_error());
     $donnees mysql_fetch_assoc($reponse);
     if($donnees['verif'] == )
     {
          echo '<h2>Action interdite</h2>';
     }
     else
     
{
          $code1 md5($code);
          mysql_query("UPDATE membre SET mot_de_passe = '" $code1 "' WHERE confirmation = '" $code "'");
          mysql_query("UPDATE membre SET confirmation = '0000' WHERE mot_de_passe = '"$code "'");
          echo '<h1>Mot de passe oublié</h1><h2>Votre mot de passe a été modifié avec succés</h2><p>Vous pouvez dès à présent vous <a href="login.html">connecter</a> avec le mot de passe généré aléatoirement (<strong>' $code '</strong>) et le changer depuis votre espace membre.</p>';
     }
 }
bas();
?>


Merci d'avance pour votre aide.

PS: L'email d'envoie d'un nouveau mdp a tendance à aller dans les dossiers spam des messageries, si j'ai fait une erreur pour ça... Merci.
Hors ligneAnthony Le 04/08/2007 à 10:09 Profil de Anthony Configuration de Anthony

Admin
Salut,

Ton problème vient du fait que lorsque tu fais tes requête UPDATE, tu ne mets pas de condition WHERE se basant sur quelque chose d'unique, à savoir l'email (normalement) ou le pseudo.

Ta requête :  mysql_query("UPDATE membre SET confirmation ='" . $confirmation . "' "); doit se transformer en

mysql_query('UPDATE membre SET confirmation ="' . $confirmation . '" WHERE email="'.$email.'"');

et ta requête : mysql_query("UPDATE membre SET confirmation = '0000' WHERE mot_de_passe = '". $code . "'");

si j'étais toi pour celle-ci je ne me baserai pas sur le mot de passe car plusieurs membres peuvent avoir le même mot de passe (et si deux membres ayant le même mot de passe désirent une confirmation en même temps, aie, bon ok ça a très peu de chances d'arriver, mais autant faire un truc propre)

Ce qui donnerait : mysql_query('UPDATE membre SET confirmation = "0000" WHERE email = "'. $email . '"');

Voilà ;)

PS : n'oublie pas un index sur le champ email (de largeur 5 à peu près) pour améliorer les performances
--

Hors ligneZingwai Le 04/08/2007 à 10:26 Profil de Zingwai Configuration de Zingwai

Bonjour Anthony.
Tout d'abord, merci pour la réponse rapide qui a l'air de marcher.

J'ai effectué une récupération pour moi et ça semble marcher (seul mon mot de passe et code de confirmation ont été changé, les miens).

Je vous tiens au courant si ça ne marche pas :)

Merci encore.
Hors ligneAnthony Le 04/08/2007 à 10:27 Profil de Anthony Configuration de Anthony

Admin
--

Vous avez résolu votre problème avec VIC ? Faites-le savoir sur les réseaux sociaux !
Vulgarisation-informatique.com
Cours en informatique & tutoriels