[RESOLU] Gérer un mot de passe oublié pour un espace membre

Mammouth du PHP | 506 Messages

04 mars 2021, 18:30

bonjour a tous

je possède un formulaire d inscription et de connexion
il ne me reste plus qu a venir y intégrer un module de mot de passe perdu

indispensable

donc j ai trouve un tuto avec php mailer qui semble fonctionner

le principe est le suivant j ai une table a créer
les fichiers phpmailer bien évidement
une connexion a ma base
et deux fichiers principaux que je joins a ce message

++++++++++++++++++++++++++++++++++++
lorsque j ouvre le fichier index
j ai bien un endroit pour indiquer l adresse mail du mot de passe perdu
je reçois bien un lien dans ma boite mail pour le changement
j effectue le changement et apparemment la table du mot de passe perdu se remplit bien
une fois le changement effectue , j ai bien un message
mais lors de la mise en fonctionnement du nouveau mot de passe la connexion ne s effectue pas


qui pourrait m aider

un grand merci



Code : Tout sélectionner

CREATE TABLE `password_reset_temp` ( `email` varchar(250) NOT NULL, `key` varchar(250) NOT NULL, `expDate` datetime NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
ensuite j ai un fichier index.php pour la création du mot de passe oublie

Code : Tout sélectionner

<?php include('db.php'); if(isset($_POST["email"]) && (!empty($_POST["email"]))){ $email = $_POST["email"]; $email = filter_var($email, FILTER_SANITIZE_EMAIL); $email = filter_var($email, FILTER_VALIDATE_EMAIL); if (!$email) { $error .="<p>Invalid email address please type a valid email address!</p>"; }else{ $sel_query = "SELECT * FROM `membres` WHERE email='".$email."'"; $results = mysqli_query($con,$sel_query); $row = mysqli_num_rows($results); if ($row==""){ $error .= "<p>No user is registered with this email address!</p>"; } } if($error!=""){ echo "<div class='error'>".$error."</div> <br /><a href='javascript:history.go(-1)'>Go Back</a>"; }else{ $expFormat = mktime( date("H"), date("i"), date("s"), date("m") ,date("d")+1, date("Y") ); $expDate = date("Y-m-d H:i:s",$expFormat); $key = md5(2418*2+$email); $addKey = substr(md5(uniqid(rand(),1)),3,10); $key = $key . $addKey; // Insert Temp Table mysqli_query($con, "INSERT INTO `password_reset_temp` (`email`, `key`, `expDate`) VALUES ('".$email."', '".$key."', '".$expDate."');"); $output='<p>Dear user,</p>'; $output.='<p>Please click on the following link to reset your password.</p>'; $output.='<p>-------------------------------------------------------------</p>'; $output.='<p><a href="https://peche-a-la-perle.000webhostapp.com/essai-03-02-21/forgot-password/reset-password.php? key='.$key.'&email='.$email.'&action=reset" target="_blank"> https://peche-a-la-perle.000webhostapp.com/essai-03-02-21/forgot-password/reset-password.php ?key='.$key.'&email='.$email.'&action=reset</a></p>'; $output.='<p>-------------------------------------------------------------</p>'; $output.='<p>Please be sure to copy the entire link into your browser. The link will expire after 1 day for security reason.</p>'; $output.='<p>If you did not request this forgotten password email, no action is needed, your password will not be reset. However, you may want to log into your account and change your security password as someone may have guessed it.</p>'; $output.='<p>Thanks,</p>'; $output.='<p>AllPHPTricks Team</p>'; $body = $output; $subject = "Password Recovery - AllPHPTricks.com"; $email_to = $email; $fromserver = "[email protected]"; require("PHPMailer/PHPMailerAutoload.php"); $mail = new PHPMailer(); $mail->IsSMTP(); $mail->Host = "smtp.gmail.com"; // Enter your host here $mail->SMTPAuth = true; $mail->Username = "[email protected]"; // Enter your email here $mail->Password = "xxxxxxx"; //Enter your password here $mail->Port = 587; $mail->IsHTML(true); $mail->From = "[email protected]"; $mail->FromName = "AllPHPTricks"; $mail->Sender = $fromserver; // indicates ReturnPath header $mail->Subject = 'peche-a-la-perle'; $mail->Body = $body; $mail->AddAddress($email_to); if(!$mail->Send()){ echo "Mailer Error: " . $mail->ErrorInfo; }else{ echo "<div class='error'> <p>An email has been sent to you with instructions on how to reset your password.</p> </div><br /><br /><br />"; } } }else{ ?> <form method="post" action="" name="reset"><br /><br /> <label><strong>Enter Your Email Address:</strong></label><br /><br /> <input type="email" name="email" placeholder="[email protected]" /> <br /><br /> <input type="submit" value="Reset Password"/> </form> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <?php } ?>
ensuite le fichier pour le changement

Code : Tout sélectionner

<?php /* Author: Javed Ur Rehman Website: https://www.allphptricks.com */ ?> <html> <head> <title>Demo Reset Password - AllPHPTricks.com</title> <link rel='stylesheet' href='css/style.css' type='text/css' media='all' /> </head> <body> <div style="width:700px; margin:50 auto;"> <h2>Demo Reset Password</h2> <?php include('db.php'); if (isset($_GET["key"]) && isset($_GET["email"]) && isset($_GET["action"]) && ($_GET["action"]=="reset") && !isset($_POST["action"])){ $key = $_GET["key"]; $email = $_GET["email"]; $curDate = date("Y-m-d H:i:s"); $query = mysqli_query($con," SELECT * FROM `password_reset_temp` WHERE `key`='".$key."' and `email`='".$email."';"); $row = mysqli_num_rows($query); if ($row==""){ $error .= '<h2>Invalid Link</h2> <p>The link is invalid/expired. Either you did not copy the correct link from the email, or you have already used the key in which case it is deactivated.</p> <p><a href="https://peche-a-la-perle.000webhostapp.com/forgot-password/index.php">Click here</a> to reset password.</p>'; }else{ $row = mysqli_fetch_assoc($query); $expDate = $row['expDate']; if ($expDate >= $curDate){ ?> <br /> <form method="post" action="" name="update"> <input type="hidden" name="action" value="update" /> <br /><br /> <label><strong>Enter New Password:</strong></label><br /> <input type="passe" name="pass1" id="pass1" maxlength="15" required /> <br /><br /> <label><strong>Re-Enter New Password:</strong></label><br /> <input type="passe" name="pass2" id="pass2" maxlength="15" required/> <br /><br /> <input type="hidden" name="email" value="<?php echo $email;?>"/> <input type="submit" id="reset" value="Reset Passe" /> </form> <?php }else{ $error .= "<h2>Link Expired</h2> <p>The link is expired. You are trying to use the expired link which as valid only 24 hours (1 days after request).<br /><br /></p>"; } } if($error!=""){ echo "<div class='error'>".$error."</div><br />"; } } // isset email key validate end if(isset($_POST["email"]) && isset($_POST["action"]) && ($_POST["action"]=="update")){ $error=""; $pass1 = mysqli_real_escape_string($con,$_POST["pass1"]); $pass2 = mysqli_real_escape_string($con,$_POST["pass2"]); $email = $_POST["email"]; $curDate = date("Y-m-d H:i:s"); if ($pass1!=$pass2){ $error .= "<p>Password do not match, both password should be same.<br /><br /></p>"; } if($error!=""){ echo "<div class='error'>".$error."</div><br />"; }else{ $pass1 = md5($pass1); mysqli_query($con, "UPDATE `membres` SET `passe`='".$pass1."', `trn_date`='".$curDate."' WHERE `email`='".$email."';"); mysqli_query($con,"DELETE FROM `password_reset_temp` WHERE `email`='".$email."';"); echo '<div class="error"><p>Congratulations! Your password has been updated successfully.</p> <p><a href="https://www.allphptricks.com/forgot-password/login.php">Click here</a> to Login.</p></div><br />'; } } ?> <br /><br /> </div> </body> </html>

Avatar du membre
Mammouth du PHP | 1564 Messages

04 mars 2021, 22:06

Lors de ta connexion à l'espace membre, il te faut exactement le même code que quand tu a rentré ton nouveau mot de passe, donc si tu fait:
//depuis formulaire de récupération
$pass1 = mysqli_real_escape_string($con,$_POST["pass1"]);

//depuis formulaire de connexion
$pass1 = mysqli_real_escape_string($con,$_POST["pass1"]);
Je doute que dans le formulaire d'inscription et de connexion, la vérification se fasse exactement comme le code que tu as trouvé ;)


Utiliser la classe PHPmailer est inutile pour ce module de récupération de mot de passe, un simple mail() suffit.

Ce sont des hackers qui postent ces bouts de codes pour ensuite pirater les sites qui l'utilisent ? hallucinant la sécurité nulle du code!

Mammouth du PHP | 506 Messages

04 mars 2021, 23:42

bonsoir
merci pour la réponse
en effet dans mon fichier de connexion je n ai pas ce genre de chose

un simple mail pour la récupération d un mot de passe , connais tu un tuto sérieux qui pourrait m aider ...a réaliser cela
c est la dernière chose qui me manque

Mammouth du PHP | 506 Messages

04 mars 2021, 23:57


Avatar du membre
Mammouth du PHP | 1564 Messages

05 mars 2021, 01:22

Trop de choses inutiles!
On demande un système de récupération de mot de passe, pas une connexion avec facebook, du style bootstrap, un token de fou alors qu'un simple
md5(str_shuffle(alphabet, chiffres et caractères spéciaux))
aurait suffit, on peut au moins configurer notre colonne SQL en char 32 pour optimiser le tout.

De plus je doute que le mail envoi correctement les accents dans le titre et le corp du mail.

Bourrage de crâne #-o

Mammouth du PHP | 506 Messages

05 mars 2021, 07:36

merci pour la réponse
connais tu un autre tuto du même genre sans tout cela ?

Avatar du membre
Mammouth du PHP | 1564 Messages

05 mars 2021, 13:29

Là tout de suite, non, désolé.

Mammouth du PHP | 506 Messages

06 mars 2021, 02:20

merci pour la réponse
lorsque tu en trouveras un
car de mon cote j ai rien trouvé de bon

Avatar du membre
Mammouth du PHP | 1564 Messages

06 mars 2021, 19:33

Un système de mdp sera dans mes prochains projets de scripts gratuits! Inscris toi sur mon site pour recevoir les nouveaux scripts par mail si tu veux (gestion du compte > alertes mail) 8-)

Mammouth du PHP | 506 Messages

06 mars 2021, 21:26

ah c est toi l auteur de ce site ??
félicitation
c était le premier que j avais remarque
je pense que j avais essaye l espace membre
mais que l on pouvait s inscrire deux fois avec la même adresse mail

Avatar du membre
Mammouth du PHP | 1564 Messages

06 mars 2021, 21:51

Oui, en signature, merci beaucoup!

J'ai pour habitude de poster des scripts simples et sans superflu.

J'aurais pu aussi rajouter d'autres champs comme Nom, Prénom, Date de naissance, etc.. mais pour comprendre le principe, c'est plus facile.

Mammouth du PHP | 506 Messages

06 mars 2021, 23:05

en fait le code st super
mais il y a juste le fait que deux utilisateurs avec le même pseudo peuvent s inscrire
et j ai jamais découvert comment y arriver
car tu ne vérifie que l adresse mail en double

Avatar du membre
Mammouth du PHP | 1564 Messages

06 mars 2021, 23:14

Prenons une comparaison:
J'ai des verres et des assiettes dans un placard, je l'ouvre et je vérifie si il y a des verres à l'intérieur (pseudo)

Pareil pour les assiettes, je regarde si il y en a à l'intérieur. (mail)
Ce que je veux dire par là, c'est que la vérification de l'adresse mail peut être faite comme la vérification du pseudo, c'est juste l'emplacement qui change.

Mammouth du PHP | 506 Messages

06 mars 2021, 23:27

merci pour la comparaison et la reponse

j ai compris le principe mais le soucis c est que je n arrive pas a m y retrouver les if et else

pourtant je suis allé voir les explications
notament celle si

Code : Tout sélectionner

if (condition) { code to be executed if condition is true; } else { code to be executed if condition is false; }

mais ce qui me perturbe dans ton code c est le else après l écho c est a cet endroit que je devrais vérifier l email juste avant l envois dans la base de donnée

Code : Tout sélectionner

else { $Pseudo=htmlentities($_POST['pseudo'],ENT_QUOTES,"UTF-8");//htmlentities avec ENT_QUOTES permet de sécuriser la requête pour éviter les injections SQL, UTF-8 pour dire de convertir en ce format $Mdp=md5($_POST['mdp']);// la fonction md5() convertie une chaine de caractères en chaine de 32 caractères d'après un algorithme PHP, cf doc $Mail=htmlentities($_POST['mail'],ENT_QUOTES,"UTF-8"); if(mysqli_num_rows(mysqli_query($mysqli,"SELECT * FROM membres WHERE pseudo='$Pseudo'"))!=0){//si mysqli_num_rows retourne pas 0 echo "Ce pseudo est déjà utilisé par un autre membre, veuillez en choisir un autre svp."; } else { //insertion du membre dans la base de données: if(mysqli_query($mysqli,"INSERT INTO membres SET pseudo='$Pseudo', mdp='$Mdp', mail='$Mail'")){ echo "Inscrit avec succès! Vous pouvez vous connecter: <a href='connexion.php'>Cliquez ici</a>."; $TraitementFini=true;//pour cacher le formulaire } else { echo "Une erreur est survenue, merci de réessayer ou contactez-nous si le problème persiste."; //echo "<br>Erreur retournée: ".mysqli_error($mysqli); } } }

Avatar du membre
Mammouth du PHP | 1564 Messages

07 mars 2021, 00:07

Le else englobe le reste du code si tu regarde bien (utilise notepad++ pour coller le curseur à une accolade pour voir jusqu'où elle va)
tu as la possibilité de faire un elseif pour remplacer le else et ainsi faire la verif du mail après le pseudo

Je me rend compte qu'il y a beaucoup de if else alors que j'aurais pu mettre plus de elseif pour limiter l'englobement du code (je simplifierais bientôt ce code)