Télécharger
Noter:

Ajouté le 2021-11-26
Visionné 6319 fois
4/5 (11)

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 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;



Faire un don
Besoin de travaux pour votre site ?

Je suis là pour vous !

Commentaires

Ajouter un commentaire

Commenter
Pseudo/Nom *
Email *
Message *
Captcha *
memo1memo2
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...

Mohamed Arfaoui le 01 Juin 2021 à 16:09

Excellent travail,
ca marche bien merci

adikpa le 04 Septembre 2021 à 12:26

Bonjour, j'ai créer une nouvelle page "mot-de-passe-oublie.php" mais le mail ne viens pas pouvez vous m'aider?

admin le 04 Septembre 2021 à 12:34

Bonjour, à la place de la fonction mail() basique de PHP, prenez la fonction mail de ce tuto:

https://www.c2script.com/scripts/formulaire-de-contact-php-s6.html

koby le 16 Septembre 2021 à 19:46

bonjour, pour le mot de passe oublié je reçois le lien dans la boite mail mais quand je clique dessus ça s'ouvre dans la messagerie. Plutôt que créer un nouveau mot de passe. Pouvez vous m'aider?

admin le 16 Septembre 2021 à 20:07

Bonjour, mettez $Lien dans une balise <a> avec l'attribut "target _blank" (je vous invite à regarder su internet pour plus d'infos).

Mais sachez qu'il vous faudra envoyer le mail en HTML avec PHP

opale21 le 17 Septembre 2021 à 13:32

Bonjour j'ai réussir a insérer le script mot de passe oublié. Et je reçois le lien lien dans le mail mais quand je clique sur le lien voilà ce qui apparait dans la nouvelle page: Not Found
The requested URL was not found on this server.

Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.

admin le 17 Septembre 2021 à 14:55

Il suffit de voir si la page existe.

Retour à la liste des scripts