Télécharger
Noter:

Ajouté le 2021-03-13
Visionné 3814 fois
3.9/5 (10)

Récupérer le mot de passe en PHP

Description

Ce script "mot de passe oublié" / "password reset", qui fonctionne parfaitement et que vous pouvez améliorer facilement, par exemple, la fonction du mot de passe peut être sécurisée avec password_hash et vous pouvez envoyer le mail PHP en UTF-8.

Ce code est un add-on du script espace membre

<?php

/*************************
* Page: mot-de-passe-oublie.php
* Page encodée en UTF-8
**************************/

//configuration pour la connexion SQL:
$SQL['host']="localhost";//serveur
$SQL['user']="root";//nom d'utilisateur
$SQL['pass']="";//pass
$SQL['base']="nom_de_la_base_de_donnees";//nom de la base de données

?><!DOCTYPE HTML>
<html>
<head>
<title>Script espace membre</title>
</head>
<body>
<h1>Récupération du mot de passe</h1>
<a href="./">Retour à l'accueil</a>

<?php
if(isset($_GET['code'],$_GET['mail'])){
//un lien est cliqué dans un mail, on recherche si le code et le mail correspondent à une ligne dans la table "recup_mdp"
$Code=htmlentities($_GET['code'],ENT_QUOTES,"UTF-8");
$Mail=htmlentities($_GET['mail'],ENT_QUOTES,"UTF-8");
$mysqli=mysqli_connect($SQL['host'],$SQL['user'],$SQL['pass'],$SQL['base']);
if(!$mysqli) {
echo "Erreur connexion BDD";
//Dans ce script, je pars du principe que les erreurs ne sont pas affichées sur le site, vous pouvez donc voir qu'elle erreur est survenue avec mysqli_connect_error(), pour cela décommentez la ligne suivante:

//echo "<br>Erreur retournée: ".mysqli_connect_error();

} else {
$req=mysqli_query($mysqli,"SELECT * FROM recup_mdp WHERE code='$Code' AND mail='$Mail'");
if(mysqli_num_rows($req)==1){
//on génère un nouveau pass (de 5 caractères) et on lui envoi:
$NouveauPass=substr(str_shuffle("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"),0,5);
//on modifie son mot de passe pour son compte
mysqli_query($mysqli,"UPDATE membres SET mdp='".md5($NouveauPass)."' WHERE mail='$Mail'");
//on ui envoi un mail avec son pass temporaire:
mail($Mail,"Votre nouveau mot de passe","Le nouveau mot de passe pour votre compte est: $NouveauPass (Il est vivement conseille de le modifier depuis votre espace membre)");
//on supprime la demande mot de passe qui est dans la table "recup_mdp":
mysqli_query($mysqli,"DELETE FROM recup_mdp WHERE code='$Code' AND mail='$Mail'");
echo "Votre nouveau pass temporaire vient d'être envoyé par mail.";
} else {
echo "Lien incorrect.";
}
}
} else {
//si le formulaire est envoyé ("envoyé" signifie que le bouton submit est cliqué)
if(isset($_POST['valider'])){
//vérifie si le champ mail est bien rempli:
if(empty($_POST['mail'])){
echo "Le champs mail n'est pas renseigné.";
} else {
//tous les champs sont précisés, on regarde si le membre est inscrit dans la bdd:
//d'abord il faut créer une connexion à la base de données dans laquelle on souhaite regarder:
$mysqli=mysqli_connect($SQL['host'],$SQL['user'],$SQL['pass'],$SQL['base']);
if(!$mysqli) {
echo "Erreur connexion BDD";
//Dans ce script, je pars du principe que les erreurs ne sont pas affichées sur le site, vous pouvez donc voir qu'elle erreur est survenue avec mysqli_error(), pour cela décommentez la ligne suivante:

//echo "<br>Erreur retournée: ".mysqli_error($mysqli);

} else {
//on défini nos variables:
$Mail=htmlentities($_POST['mail'],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
$req=mysqli_query($mysqli,"SELECT * FROM membres WHERE mail='$Mail'");
//on regarde si le membre est inscrit dans la bdd:
//même si le membre n'existe pas, on affiche qu'un mail à été envoyé, ceci permet d'empécher les robots de voir si un mail existe ou pas dans votre base de données et de vous le dérober
if(mysqli_num_rows($req)!=1){
//mail inconnu
} else {
//mail connu, on lance la procédure d'envoi du mail pour recevoir un nouveau mdp
$Code=md5(rand(1,99999999));
mysqli_query($mysqli,"INSERT INTO recup_mdp SET code='$Code', mail='$Mail'");
$Lien=$_SERVER['HTTP_HOST']."/mot-de-passe-oublie.php?code=$Code&mail=$Mail";
mail($Mail,"Recuperation du mot de passe","Pour recevoir un nouveau mot de passe cliquez sur le lien suivant: $Lien");
}
echo "<p>Si votre mail est inscrit, vous allez recevoir un mail contenant un lien à cliquer afin de recevoir un nouveau mot de passe.</p>";
$TraitementFini=true;//pour cacher le formulaire
}
}
}
if(!isset($TraitementFini)){//quand le membre sera connecté, on définira cette variable afin de cacher le formulaire
?>
<br>
<p>Remplissez le formulaire ci-dessous pour recevoir un nouveau mot de passe:</p>
<form method="post" action="mot-de-passe-oublie.php">
<input type="text" name="mail" placeholder="Votre mail..." required><!-- required permet d'empêcher l'envoi du formulaire si le champ est vide -->
<input type="submit" name="valider" value="Recevoir un nouveau mot de passe">
</form>
<?php
}
}
?>
</body>
</html>


CREATE TABLE `recup_mdp` (
`id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
`code` char(32) COLLATE utf8_unicode_ci NOT NULL,
`mail` varchar(50) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Besoin de travaux pour votre site ?

Je suis là pour vous aider !

Commentaires

Ajouter un commentaire

Commenter
Pseudo/Nom *
Email *
Message *
Captcha *
memo2
Commenter

Les champs marqués d'un * sont obligatoires.

keou le 14 Juin 2020 à 13:19

Bonjour
je voudrais intégrer le script mot-de-passe-oublié dans les scripts espace membre qui fonctionne parfaitement.
Mais je ne sais comment m'y prendre.
pouvez-vous m'aider? Merci

admin le 15 Juin 2020 à 15:20

Bonjour, il vous suffit de créer une nouvelle page "mot-de-passe-oublie.php" et dy coller le code pour que les membres puissent demander un nouveau mdp.

Coco le 24 Juin 2020 à 16:17

Bonjour, sommes nous obligés d'installer sendMail pour envoyer le mail de récupération, car sous wamp, j'ai une erreur.

Merci.

admin le 24 Juin 2020 à 16:54

Voir ce tutot pour la configuration de wamp pour envoyer des mails:

https://www.c2script.com/scripts/envoyer-un-mail-avec-wampserver-sans-sendmail-exe-s43.html

Vous avez quelle version WAMP ? et quelle version PHP utilisez-vous ?

coco le 24 Juin 2020 à 17:13

J'ai Wamp 3.2 et PHP 7.3.12.

J'ai réussi à configurer l'envoi du mail. Merci.

Je me confronte actuellement à un autre soucis, c'est le lien dans le mail qui n'est pas cliquable, et qui renvoi une erreur si je le copie/colle dans l'URL.

Merci.

admin le 24 Juin 2020 à 21:07

Si vous souhaitez qu'il soit cliquable, entourez le ($Lien) avec la base <a>

Quelle erreur avez vous ? peut mettre l'URL de votre site directement plutôt que $_SERVER['HTTP_HOST']

Coco le 25 Juin 2020 à 11:06

Merci beaucoup, pour votre aide.

Je vous remercie.

flexi2202 le 07 Février 2021 à 12:47

bonjour
avant toute chose bravo pour votre code et celui de l espace membre
j ai une question concernant la base de donnée , faut il l implanter dans celle de la zone membre "membres"ou alors ce sont deux tables bien différentes
merci de l aide

admin le 07 Février 2021 à 13:26

Merci, c'est une table autonome, vous devez avoir la table membres et la table recup_mdp

Hamatchou le 28 Mars 2021 à 18:39

Quand j’envoie, le nom de mon hébergeur apparait dans le mail. En entête, que faire ?

admin le 28 Mars 2021 à 22:58

Bonjour, vous pouvez utiliser cette méthode pour envoyer un mail en PHP

Hervé le 10 Avril 2021 à 11:39

Bonjour,
Merci pour votre travail
Le script fonctionne sur mon ordi mais pas sur mon smartphone.
Je reçois le lien suivant qui ouvre ma messagerie xxx@xxx.fr si je clique dessus au lieu de créer un nouveau mail.
Pour recevoir un nouveau mot de passe cliquez sur le lien suivant: https://monsite.fr/mdp_oublie.php?code=48c6bbf7314400f82bde68ae894ef67c&mail=xxxx@xxx.fr
Auriez-vous une explication ?
Merci

admin le 10 Avril 2021 à 12:23

Bonjour et merci,

pour recevoir un mail "correct" ou "valide", je vous invite à utiliser des entêtes dans la fonctions mail() qui vous permettra de l'envoyer en HTML et ainsi de de mettre $Lien dans une balise <a>, voir ce tuto pour mettre des entêtes à la fonction mail()

Hervé le 10 Avril 2021 à 15:50

Donc j'ai modifié la fonction mail avec les entêtes et mis un lien direct (<a href="xxx&mail=$Mail>Lien</a>) en $Message
Le premier mail arrive maintenant normalement sur tel et pc.
Mais quand je clique sur le lien, j'obtiens "Lien incorrect" dans un nouvel onglet...
Help !

admin le 10 Avril 2021 à 17:16

il vous faut voir pourquoi l'adresse est incorrect, c'est pas grand chose en général, un oubli ou un " ou ' en plus dans l'URl, peut être un espace en +, à voir...

Retour à la liste des scripts