- Password_verify ne fonctionne pas
- Voir mot de passe wifi android - Guide
- Mot de passe administrateur - Guide
- Trousseau mot de passe iphone - Guide
- Identifiant et mot de passe - Guide
- Mettre un mot de passe sur un dossier - Guide
7 réponses
6 oct. 2022 à 12:09
Bonjour,
Vu les bouts de code que tu nous montres , il n'y a pas de raison qu'il soit en sha1.
On peut en déduire que tu ne modifies pas au bon endroit ( ou que tu en as oublié).
Au lieu de ne mettre que quelques extraits de code, colle nous l'intégralité de ton fichier ( sans oublier d'en indiquer le nom au cas où il y aurait plusieurs fichiers )
Pour info mon message d'erreur arrive quand j'essaye de me connecter avec le compte que j'ai réinitialisé du au fait que l'UPDATE a insérer le mdp en sha1 alors que pour la connexion j'utilise password_verify() donc ce qui parait logique.
Voilà mes 2 fonctions qui gèrent la réinitialisation d'un mot de passe:
- D'abord ici je récup l'id et le mail que l'utilisateur rentre pour demander la réinitailisation de son mdp. Ensuite si il existe je créer un nouveau mdp que je rentre en clair dans une table (reinit_passwd) pour pouvoir le récupérer plus tard (cet enregistrement est par la suite supprimé) et ensuite j'envoi un mail qui donne un lien qui revient sue l'application avec un message "votre mot de passe a été réinitialisé" (si ça a marché) et par la suite je reçois un autre mail avec le nouveau mot de passe.
public function motDePasseReinitValid($login, $mail) { $req = "SELECT id, mail, password FROM user WHERE login = '$login' AND mail = '$mail'"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":login", $login, PDO::PARAM_STR); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); if ($resultat == false) { Toolbox::ajouterMessageAlerte("Combinaison Login / Mail non valide", Toolbox::COULEUR_ROUGE); header('Location: ' . URL . "users/motdepasse"); } else { $char = '1234567890abcdefghijklmnopqrstuvwxyz0123456789'; $key = str_shuffle($char); $longueur = '8'; $possible = '123456789abcdfghjkmnpqrtvwxyzABCDFGHJKLMNPQRTVWXYZ'; $mdp = ''; // cette valeur sera utilisé plus tard $longueurMax = strlen($possible); if ($longueur > $longueurMax) { $longueur = $longueurMax; } $i = 0; while ($i < $longueur) { // prend un caractère aléatoire $caractere = substr($possible, mt_rand(0, $longueurMax - 1), 1); $mdp .= $caractere; $i++; } $req = "INSERT INTO reinit_passwd(id_user, key_gen, new_passwd) VALUES(:id_user, :key_gen, :new_password)"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":id_user", $resultat['id'], PDO::PARAM_STR); $stmt->bindValue(":key_gen", $key, PDO::PARAM_STR); $stmt->bindValue(":new_password", $mdp, PDO::PARAM_STR); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); //=====Déclaration des messages au format texte et au format HTML. $passage_ligne = "\r\n"; $message_txt = "Bonjour, vous avez fait une demande de nouveau mot de passe pour le Portail Bl."; $message_html = "<html><head></head><body>Bonjour,<br /><br /> Vous avez fait une demande de nouveau mot de passe pour <b>le Portail Bl</b>.<br /><br />Pour confirmer la réinitialisation du mot de passe, merci de cliquer sur le lien ci-dessous : <br /><br /><a href=\"http://dns.fr/portail/users/motdepassereinitvalid/" . $key . "\">http://dns.fr/portail/users/motdepassereinitvalid/" . $key . "<a/></body></html>"; //========== //=====Création de la boundary. $boundary = "-----=" . md5(rand()); $boundary_alt = "-----=" . md5(rand()); //========== //=====Définition du sujet. $sujet = "Portail - Mot de passe oubli". chr(233); //========= //=====Création du header de l'e-mail. $header = "From: \"Portail Bl\"***@***>" . $passage_ligne; $header .= "Reply-to: \"Portail Bl \" ***@***>" . $passage_ligne; $header .= "MIME-Version: 1.0" . $passage_ligne; $header .= "Content-Type: multipart/mixed;" . $passage_ligne . " boundary=\"$boundary\"" . $passage_ligne; //========== //=====Création du message. $message = $passage_ligne . "--" . $boundary . $passage_ligne; $message .= "Content-Type: multipart/alternative;" . $passage_ligne . " boundary=\"$boundary_alt\"" . $passage_ligne; $message .= $passage_ligne . "--" . $boundary_alt . $passage_ligne; //=====Ajout du message au format texte. $message .= "Content-Type: text/plain; charset=\"ISO-8859-1\"" . $passage_ligne; $message .= "Content-Transfer-Encoding: 8bit" . $passage_ligne; $message .= $passage_ligne . $message_txt . $passage_ligne; //========== $message .= $passage_ligne . "--" . $boundary_alt . $passage_ligne; //=====Ajout du message au format HTML. $message .= "Content-Type: text/html; charset=\"ISO-8859-1\"" . $passage_ligne; $message .= "Content-Transfer-Encoding: 8bit" . $passage_ligne; $message .= $passage_ligne . $message_html . $passage_ligne; //========== //=====On ferme la boundary alternative. $message .= $passage_ligne . "--" . $boundary_alt . "--" . $passage_ligne; $message .= $passage_ligne . "--" . $boundary . $passage_ligne; //========== if (mail($mail, $sujet, $message, $header)) { Toolbox::ajouterMessageAlerte("Un mail pour la réinitialisation du mot de passe vient de vous être envoyé", Toolbox::COULEUR_VERTE); header('Location: ' . URL); } else { Toolbox::ajouterMessageAlerte("Echec de l'envoi du mail. Essayez de recommencer. Si le problème persiste, contactez la cellule SI", Toolbox::COULEUR_ROUGE); } }
Ici on commence par récupérer le nouveau mdp en clair si il existe on récupère le mail de l'utilisateur. Je modifie ensuite le mdp de l'utilisateur avec un UPDATE qui doit rentré NORMALENT un mdp haché avec la fonction password_hash() et pas haché en sha1. On supprime par la suite donc le mdp en clair dans la table reinit_passwd et on envoi le mail avec le nouveau mot de passe.
//Fonction pour valider la réinitialisation du mot de passe public function motDePasseReinitValidation($key) { $req = "SELECT id, id_user, new_passwd FROM reinit_passwd WHERE key_gen = '$key'"; $stmt = $this->getBdd()->prepare($req); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); if ($resultat > 0) { $idtempo = $resultat['id_user']; $motdepassetemp = $resultat['new_passwd']; $motdepassehash = password_hash($motdepassetemp, PASSWORD_DEFAULT); //$motdepassehash = hash('sha256',$motdepassetemp); //$motdepassehash = sha1($motdepassetemp); $req = "SELECT mail FROM user WHERE id = $idtempo"; $stmt = $this->getBdd()->prepare($req); $stmt->execute(); $resultatmail = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); $mailtest = $resultatmail['mail']; $req = "UPDATE user SET password = :password WHERE id = :id"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":id", $idtempo, PDO::PARAM_INT); $stmt->bindValue(":password", $motdepassehash, PDO::PARAM_STR); $resultat = $stmt->execute(); $stmt->closeCursor(); $req = " DELETE FROM reinit_passwd WHERE id_user = $idtempo "; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":id_user", $idtempo, PDO::PARAM_INT); $resultatdelete = $stmt->execute(); $stmt->closeCursor(); //=====Déclaration des messages au format texte et au format HTML. $passage_ligne = "\r\n"; $message_txt = "Bonjour, vous avez réinitialisé; votre mot de passe pour le Portail."; $message_html = "<html><head></head><body>Bonjour,<br /><br /> Vous avez réinitialisé; votre mot de passe.<br /><br /> Nouveau mot de passe : " . $motdepassetemp . "<a/></body></html>"; //========== //=====Création de la boundary. $boundary = "-----=" . md5(rand()); $boundary_alt = "-----=" . md5(rand()); //========== //=====Définition du sujet. $sujet = "Portail - Nouveau mot de passe"; //========= //=====Création du header de l'e-mail. $header = "From: \"Portail\"<***@***>" . $passage_ligne; $header .= "Reply-to: \"Portail\"<***@***>" . $passage_ligne; $header .= "MIME-Version: 1.0" . $passage_ligne; $header .= "Content-Type: multipart/mixed;" . $passage_ligne . " boundary=\"$boundary\"" . $passage_ligne; //========== //=====Création du message. $message = $passage_ligne . "--" . $boundary . $passage_ligne; $message .= "Content-Type: multipart/alternative;" . $passage_ligne . " boundary=\"$boundary_alt\"" . $passage_ligne; $message .= $passage_ligne . "--" . $boundary_alt . $passage_ligne; //=====Ajout du message au format texte. $message .= "Content-Type: text/plain; charset=\"ISO-8859-1\"" . $passage_ligne; $message .= "Content-Transfer-Encoding: 8bit" . $passage_ligne; $message .= $passage_ligne . $message_txt . $passage_ligne; //========== $message .= $passage_ligne . "--" . $boundary_alt . $passage_ligne; //=====Ajout du message au format HTML. $message .= "Content-Type: text/html; charset=\"ISO-8859-1\"" . $passage_ligne; $message .= "Content-Transfer-Encoding: 8bit" . $passage_ligne; $message .= $passage_ligne . $message_html . $passage_ligne; //========== //=====On ferme la boundary alternative. $message .= $passage_ligne . "--" . $boundary_alt . "--" . $passage_ligne; $message .= $passage_ligne . "--" . $boundary . $passage_ligne; //========== //=====Envoi de l'e-mail. if (mail($mailtest, $sujet, $message, $header) && ($resultatdelete != false) && ($resultat != false) && ($resultatmail != false)) { Toolbox::ajouterMessageAlerte("Votre mot de passe a bien été réinitialisé", Toolbox::COULEUR_VERTE); header('Location: ' . URL); } else { Toolbox::ajouterMessageAlerte("Echec de la réinitialisation du mot de passe - Code erreur : #UM01", Toolbox::COULEUR_ROUGE); header('Location: ' . URL . "users/motdepasse"); } } else { Toolbox::ajouterMessageAlerte("Le lien n'a pas été approuvé par notre site. Veuillez réessayer. Code erreur : #UM02", Toolbox::COULEUR_ROUGE); header('Location: ' . URL . "users/motdepasse"); } }
Je tiens à dire que ces deux fonction sont sur la même page elles sont d'ailleurs à la suite.
Voilà ça fait un peu de lecture pour les plus courageux, merci d'avance !
6 oct. 2022 à 14:51
Je ne vois rien d'anormal.
Reste à voir comment tu fais l'authentification maintenant....
Tu passes bien par du password_verify ?
Modifié le 6 oct. 2022 à 15:23
Le problème c'est que je le vois changer le mdp dans la table et je vois bien qu'il est stocké en sha1
Mais oui je passe bien par la fonction password_verify() :
// Fonction qui compare le mot de passe de la bdd et celui rentré par l'utilisateur public function isCombinaisonValide($login, $password) { //$password = hash('sha256',$password); //$password = sha1($password); $passwordBD = $this->getPasswordUser($login); // Code erreur: #UM04 if (password_verify($password, $passwordBD)) { return true; } else { // à décommenter lors du passage en prod et commenter la ligne en dessous Toolbox::ajouterMessageAlerte("Echec lors de la connexion", Toolbox::COULEUR_ROUGE); Toolbox::ajouterMessageAlerte("Echec de la comparaison - Code erreur: #UM04", Toolbox::COULEUR_ROUGE); return false; } }
Ici en paramètre de la fonction je récupère la saisie de l'utilisateur.
De plus elle marche quand je me connecte car tant que je ne réinitialise pas mon mdp tout fonctionne bien.
Le vrai problème (je pense) c'est pourquoi à la réinitialisation du mdp il me l'insère en sha1 dans ma table ??
6 oct. 2022 à 15:33
Le code de vérif me semble bon également.
Tu es certain que ça met bien à jour la password dans ta table ?
Un test simple...
Tu supprime le password existant dans la bdd.
Tu lances ton code pour le changer ..
Tu regardes dans ta bdd si tu as bien une nouvelle valeur qui s'y est inscrite.
N'hésites pas non plus à ajouter des echo / var_dump de tes variables dans ton code pour voir par où ton code passe et si il passe bien dans les fonctions que tu nous montres.
Ca te permettra aussi de voir le mot de passe hashé .. si il est conforme à ce que tu attends.
Au passage, pendant que j'y pense, vérifie aussi la taille du champ qui est sensé accueillir le mot de passe hashé dans ta bdd. Il est assez grand ?
Au passage.. Tu utilises du PDO visiblement.
Il serait bien d'activer la gestion des erreurs PDO dans la connexion à ta bdd ET A CHAQUE REQUETE.
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs
6 oct. 2022 à 16:21
Je viens de réessayer une fois de plus et oui je suis certains que mon mot de passe se met à jour dans ma table il change le mdp haché avec password_hash() par le nouveau mdp envoyé par mail haché en sha1 (j'utilise un site après pour crypter en sha1 et vérifier que le hachage du nouveau mdp est bien du sha1)
Pour ce qui est des erreurs PDO, ma connexion à la BD :
private static function setBdd(){ // BD PROD self::$pdo = new PDO("mysql:host=xxx;dbname=xxxx;charset=utf8","xxxx","password"); self::$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING); }
J'ai essayé de mettre des var_dump() mais je crois que je les met aux mauvaise endroits car j'ai rien vu.
J'aussi ajouté ça en haut de ma page mais pas de changement :
error_reporting(E_ALL); ini_set('display_errors', TRUE); ini_set('display_startup_errors', TRUE);
Pour te donner une idée de l'erreur :
et le code qui gère ca derrière :
// Fonction qui compare le mot de passe de la bdd et celui rentré par l'utilisateur public function isCombinaisonValide($login, $password) { //$password = hash('sha256',$password); //$password = sha1($password); $passwordBD = $this->getPasswordUser($login); if (password_verify($password, $passwordBD)) { var_dump($passwordBD); //le var_dump ici ne m'a rien affiché à la connexion return true; } else { // à décommenter lors du passage en prod et commenter la ligne en dessous Toolbox::ajouterMessageAlerte("Echec lors de la connexion", Toolbox::COULEUR_ROUGE); Toolbox::ajouterMessageAlerte("Echec de la comparaison - Code erreur: #UM04", Toolbox::COULEUR_ROUGE); var_dump($passwordBD); //le var_dump ici ne m'a rien affiché à la tentative de connexion return false; }
Je comprend vraiment pas d'où il me sort du sha1...
6 oct. 2022 à 16:40
Tu fais appel comment à tes fonctions ?
Ne serait-ce pas de l'ajax ?
Encore une fois .. si tu ne nous mets que des morceaux de code et non pas les fichiers complets ... on ne peut pas savoir quel est le cheminement du code ...
Non ce n'est pas de l'ajax, c'est du PHP pur et dur
Dans mon projet je fais appel aux fonctions depuis des Controllers :
<?php require_once "models/UserManager.class.php"; class UserController { public $userManager; public function __construct() { $this->userManager = new UserManager; $this->userManager->chargementUsers(); } public function afficherUsers() { $users = $this->userManager->getUser(); require "views/user/users.view.php"; } public function modificationUser($id) { $user = $this->userManager->getUserById($id); require "views/user/updateUser.view.php"; } public function ajoutUser() { require "views/user/createUser.view.php"; } public function motDePasseOublie() { require "views/motDePasseOublie.view.php"; } public function ajoutuserValidation() { if ($_POST['bl'] != 'on') { $_POST['bl'] = 0; } else { $_POST['bl'] = 1; } if ($_POST['dist'] != 'on') { $_POST['dist'] = 0; } else { $_POST['dist'] = 1; } if ($_POST['admin'] != 'on') { $_POST['admin'] = 0; } else { $_POST['admin'] = 1; } if ($_POST['demandevalidation'] != 'on') { $_POST['demandevalidation'] = 0; } else { $_POST['demandevalidation'] = 1; } if ($_POST['pilote'] != 'on') { $_POST['pilote'] = 0; } else { $_POST['pilote'] = 1; } if ($_POST['rs'] != 'on') { $_POST['rs'] = 0; } else { $_POST['rs'] = 1; } if ($_POST['password'] === $_POST['passwordverif']) { $this->userManager->ajoutUserBd( $_POST['login'], $_POST['password'], $_POST['mail'], $_POST['admin'], $_POST['bl'], $_POST['dist'], $_POST['NomPrenom'], $_POST['demandevalidation'], $_POST['pilote'], $_POST['rs'] ); header('Location: ' . URL . "users"); } else { Toolbox::ajouterMessageAlerte("Les mots de passe ne sont pas les mêmes", Toolbox::COULEUR_ROUGE); } } public function modificationUserValidation() { if ($_POST['bl'] != 'on') { $_POST['bl'] = 0; } else { $_POST['bl'] = 1; } if ($_POST['dist'] != 'on') { $_POST['dist'] = 0; } else { $_POST['dist'] = 1; } if ($_POST['admin'] != 'on') { $_POST['admin'] = 0; } else { $_POST['admin'] = 1; } if ($_POST['demandevalidation'] != 'on') { $_POST['demandevalidation'] = 0; } else { $_POST['demandevalidation'] = 1; } if ($_POST['pilote'] != 'on') { $_POST['pilote'] = 0; } else { $_POST['pilote'] = 1; } if ($_POST['rs'] != 'on') { $_POST['rs'] = 0; } else { $_POST['rs'] = 1; } $this->userManager->modificationUserBd( $_POST['id'], $_POST['login'], $_POST['mail'], $_POST['admin'], $_POST['bl'], $_POST['dist'], $_POST['NomPrenom'], $_POST['demandevalidation'], $_POST['pilote'], $_POST['rs'] ); Toolbox::ajouterMessageAlerte("La modification a été effectuée avec succès", Toolbox::COULEUR_VERTE); header('Location: ' . URL . "users"); } public function motDePasseReinit() { if ((!empty($_POST['login'])) && (!empty($_POST['mail']))) { $this->userManager->motDePasseReinitValid( $_POST['login'], $_POST['mail'] ); } else { Toolbox::ajouterMessageAlerte("Combinaison Login / Mail non valide", Toolbox::COULEUR_ROUGE); header('Location: ' . URL . "users/motdepasse"); } } public function motDePasseReinitValid($key) { $this->userManager->motDePasseReinitValidation($key); } public function login() { require "views/login.view.php"; } public function validation_login($login, $password) { if ($this->userManager->isCombinaisonValide($login, $password)) { Toolbox::ajouterMessageAlerte("Bon retour sur le portail " . $login . " ! AJOUT DU SYSTEME DE FILTRE POUR LES INCIDENTS" , Toolbox::COULEUR_VERTE); $_SESSION['profil'] = [ "login" => $login, ]; $datas = $this->userManager->getUserInformation($_SESSION['profil']['login']); $_SESSION['profil']["bl"] = $datas['bl']; $_SESSION['profil']["dist"] = $datas['dist']; $_SESSION['profil']["admin"] = $datas['admin']; $_SESSION['profil']["demandevalidation"] = $datas['demandevalidation']; $_SESSION['profil']["pilote"] = $datas['pilote']; $_SESSION['profil']["rs"] = $datas['rs']; if (Securite::estConnecte() && Securite::estBl()) { header("Location: " . URL . "tngs"); } else { header("Location: " . URL . "accueil"); } } else { Toolbox::ajouterMessageAlerte("Combinaison Login / Mot de passe non valide", Toolbox::COULEUR_ROUGE); header("location: " . URL); } } public function profil() { $datas = $this->userManager->getUserInformation($_SESSION['profil']['login']); $_SESSION['profil']["bl"] = $datas['bl']; $_SESSION['profil']["dist"] = $datas['dist']; $_SESSION['profil']["admin"] = $datas['admin']; $_SESSION['profil']["demandevalidation"] = $datas['demandevalidation']; $_SESSION['profil']["pilote"] = $datas['pilote']; $_SESSION['profil']["rs"] = $datas['rs']; } public function deconnexion() { $domain = ($_SERVER['HTTP_HOST'] != 'localhost') ? $_SERVER['HTTP_HOST'] : false; Toolbox::ajouterMessageAlerte("La deconnexion est effectuée", Toolbox::COULEUR_VERTE); unset($_SESSION['profil']); setcookie(Securite::COOKIE_NAME,"",time() - 3600, '/', $domain, false, true); header("Location: " . URL); } public function deleteUser($id) { $this->userManager->deleteUserBd($id); header('Location: ' . URL . "users"); } }
Dans ce Controller je fais appel aux fonctions de réinitialisation de mot de passe
Dailleurs je ne sais pas vraiment à quoi sert ces lignes ? (je rappel que je reprend le projet de quelqu'un avec aucune doc) :
public function motDePasseReinitValid($key) { $this->userManager->motDePasseReinitValidation($key); }
PS: l'appli est quand même assez conséquentes donc vous balancer tout le code ne servirait pas trop de plus, c'est un projet d'entreprise donc faut que je fasse gaffe à ce que j'envois.
6 oct. 2022 à 17:21
ok.
Par contre, tu ne vois pas tes echo et tes var_dump car il faut désactiver toutes les redirections
header('Location: ...
7 oct. 2022 à 09:46
Re, j'ai refais un test (spoil: même problème, il me remet le mdp en sha1)
J'ai ajouté des var_dump() et enlevé les header(), les 2 fonctions motDePasseReinitValid() et motDePasseReinitValidation() comme ceci :
public function motDePasseReinitValid($login, $mail) { $req = "SELECT id, mail, password FROM user WHERE login = '$login' AND mail = '$mail'"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":login", $login, PDO::PARAM_STR); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); if ($resultat == false) { Toolbox::ajouterMessageAlerte("Combinaison Login / Mail non valide", Toolbox::COULEUR_ROUGE); //header('Location: ' . URL . "users/motdepasse"); var_dump($resultat); } else { $char = '1234567890abcdefghijklmnopqrstuvwxyz0123456789'; $key = str_shuffle($char); $longueur = '8'; $possible = '123456789abcdfghjkmnpqrtvwxyzABCDFGHJKLMNPQRTVWXYZ'; $mdp = ''; // cette valeur sera utilisé plus tard $longueurMax = strlen($possible); if ($longueur > $longueurMax) { $longueur = $longueurMax; } $i = 0; while ($i < $longueur) { // prend un caractère aléatoire $caractere = substr($possible, mt_rand(0, $longueurMax - 1), 1); $mdp .= $caractere; $i++; } $req = "INSERT INTO reinit_passwd(id_user, key_gen, new_passwd) VALUES(:id_user, :key_gen, :new_passwd)"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":id_user", $resultat['id'], PDO::PARAM_STR); $stmt->bindValue(":key_gen", $key, PDO::PARAM_STR); $stmt->bindValue(":new_passwd", $mdp, PDO::PARAM_STR); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); var_dump($resultat); //=====Déclaration des messages au format texte et au format HTML. $passage_ligne = "\r\n"; $message_txt = "Bonjour, vous avez fait une demande de nouveau mot de passe pour le portail."; $message_html = "<html><head></head><body>Bonjour,<br /><br /> Vous avez fait une demande de nouveau mot de passe pour <b>le portail</b>.<br /><br />Pour confirmer la réinitialisation du mot de passe, merci de cliquer sur le lien ci-dessous : <br /><br /><a href=\"http://dns.fr/portail/users/motdepassereinitvalid/" . $key . "\">http://dns.fr/portail/users/motdepassereinitvalid/" . $key . "<a/></body></html>"; //========== //=====Création de la boundary. $boundary = "-----=" . md5(rand()); $boundary_alt = "-----=" . md5(rand()); //========== //=====Définition du sujet. $sujet = "portail - Mot de passe oubli". chr(233); //========= //=====Création du header de l'e-mail. $header = "From: \"portail\"<***@***>" . $passage_ligne; $header .= "Reply-to: \"portail \" <***@***>" . $passage_ligne; $header .= "MIME-Version: 1.0" . $passage_ligne; $header .= "Content-Type: multipart/mixed;" . $passage_ligne . " boundary=\"$boundary\"" . $passage_ligne; //========== //=====Création du message. $message = $passage_ligne . "--" . $boundary . $passage_ligne; $message .= "Content-Type: multipart/alternative;" . $passage_ligne . " boundary=\"$boundary_alt\"" . $passage_ligne; $message .= $passage_ligne . "--" . $boundary_alt . $passage_ligne; //=====Ajout du message au format texte. $message .= "Content-Type: text/plain; charset=\"ISO-8859-1\"" . $passage_ligne; $message .= "Content-Transfer-Encoding: 8bit" . $passage_ligne; $message .= $passage_ligne . $message_txt . $passage_ligne; //========== $message .= $passage_ligne . "--" . $boundary_alt . $passage_ligne; //=====Ajout du message au format HTML. $message .= "Content-Type: text/html; charset=\"ISO-8859-1\"" . $passage_ligne; $message .= "Content-Transfer-Encoding: 8bit" . $passage_ligne; $message .= $passage_ligne . $message_html . $passage_ligne; //========== //=====On ferme la boundary alternative. $message .= $passage_ligne . "--" . $boundary_alt . "--" . $passage_ligne; $message .= $passage_ligne . "--" . $boundary . $passage_ligne; //========== if (mail($mail, $sujet, $message, $header)) { Toolbox::ajouterMessageAlerte("Un mail pour la réinitialisation du mot de passe vient de vous être envoyé", Toolbox::COULEUR_VERTE); //header('Location: ' . URL); } else { Toolbox::ajouterMessageAlerte("Echec de l'envoi du mail. Essayez de recommencer. Si le problème persiste, contactez la cellule SI", Toolbox::COULEUR_ROUGE); } } } //Fonction pour valider la réinitialisation du mot de passe public function motDePasseReinitValidation($key) { $req = "SELECT id, id_user, new_passwd FROM reinit_passwd WHERE key_gen = '$key'"; $stmt = $this->getBdd()->prepare($req); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); if ($resultat > 0) { $idtempo = $resultat['id_user']; $motdepassetemp = $resultat['new_passwd']; $motdepassehash = password_hash($motdepassetemp, PASSWORD_DEFAULT); //$motdepassehash = hash('sha256',$motdepassetemp); //$motdepassehash = sha1($motdepassetemp); $req = "SELECT mail FROM user WHERE id = $idtempo"; $stmt = $this->getBdd()->prepare($req); $stmt->execute(); $resultatmail = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); $mailtest = $resultatmail['mail']; $req = "UPDATE user SET password = :password WHERE id = :id"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":id", $idtempo, PDO::PARAM_INT); $stmt->bindValue(":password", $motdepassehash, PDO::PARAM_STR); $resultat = $stmt->execute(); $stmt->closeCursor(); var_dump($motdepassehash); $req = " DELETE FROM reinit_passwd WHERE id_user = $idtempo "; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":id_user", $idtempo, PDO::PARAM_INT); $resultatdelete = $stmt->execute(); $stmt->closeCursor(); //=====Déclaration des messages au format texte et au format HTML. $passage_ligne = "\r\n"; $message_txt = "Bonjour, vous avez réinitialisé votre mot de passe pour le portail."; $message_html = "<html><head></head><body>Bonjour,<br /><br /> Vous avez réinitialisé votre mot de passe.<br /><br /> Nouveau mot de passe : " . $motdepassetemp . "<a/></body></html>"; //========== //=====Création de la boundary. $boundary = "-----=" . md5(rand()); $boundary_alt = "-----=" . md5(rand()); //========== //=====Définition du sujet. $sujet = "portail - Nouveau mot de passe"; //========= //=====Création du header de l'e-mail. $header = "From: \"portail\"<***@***>" . $passage_ligne; $header .= "Reply-to: \"portail\"<***@***>" . $passage_ligne; $header .= "MIME-Version: 1.0" . $passage_ligne; $header .= "Content-Type: multipart/mixed;" . $passage_ligne . " boundary=\"$boundary\"" . $passage_ligne; //========== //=====Création du message. $message = $passage_ligne . "--" . $boundary . $passage_ligne; $message .= "Content-Type: multipart/alternative;" . $passage_ligne . " boundary=\"$boundary_alt\"" . $passage_ligne; $message .= $passage_ligne . "--" . $boundary_alt . $passage_ligne; //=====Ajout du message au format texte. $message .= "Content-Type: text/plain; charset=\"ISO-8859-1\"" . $passage_ligne; $message .= "Content-Transfer-Encoding: 8bit" . $passage_ligne; $message .= $passage_ligne . $message_txt . $passage_ligne; //========== $message .= $passage_ligne . "--" . $boundary_alt . $passage_ligne; //=====Ajout du message au format HTML. $message .= "Content-Type: text/html; charset=\"ISO-8859-1\"" . $passage_ligne; $message .= "Content-Transfer-Encoding: 8bit" . $passage_ligne; $message .= $passage_ligne . $message_html . $passage_ligne; //========== //=====On ferme la boundary alternative. $message .= $passage_ligne . "--" . $boundary_alt . "--" . $passage_ligne; $message .= $passage_ligne . "--" . $boundary . $passage_ligne; //========== //=====Envoi de l'e-mail. if (mail($mailtest, $sujet, $message, $header) && ($resultatdelete != false) && ($resultat != false) && ($resultatmail != false)) { Toolbox::ajouterMessageAlerte("Votre mot de passe a bien été réinitialisé", Toolbox::COULEUR_VERTE); //header('Location: ' . URL); } else { Toolbox::ajouterMessageAlerte("Echec de la réinitialisation du mot de passe - Code erreur : #UM01", Toolbox::COULEUR_ROUGE); //header('Location: ' . URL . "users/motdepasse"); } } else { Toolbox::ajouterMessageAlerte("Le lien n'a pas été approuvé par notre site. Veuillez réessayer. Code erreur : #UM02", Toolbox::COULEUR_ROUGE); //header('Location: ' . URL . "users/motdepasse"); } }
Et j'ai donc réinitialisé le mdp et j'ai quand même eu une erreur lorque j'ai envoyé le formulaire de réinitialisation du mdp (le form : id et mail de l'user) :
la ligne 309 dans la fonction motDePasseReinitValid($login, $mail) :
$resultat = $stmt->fetch(PDO::FETCH_ASSOC);
une erreur sur la variable que je dump donc
Mais malgré cette erreur je reçois bien l'email de réinitialisation, je clique sur le lien de réinitialisation qui m'ouvre deux pages :
La première :
Une page de réinitialisation du mot de passe (celle où je rentre mon id et mon mail pour demander la réinitialisation du mdp) avec cette erreur :
La deuxième :
elle me remet sur la page login avec le message qui confirme la réinitialisation. Ce qui est vrai car je reçois le deuxième mail avec le nouveau mot de passe.
Donc pour finir j'essaye de me connecter avec le nouveau mdp mais ça ne fonctionne pas car j'utilise password_verify() (pour tester si le mdp correspond à ce que l'utilisateur rentre) alors qu'il est haché en sha1 à l'update de la table user...
7 oct. 2022 à 09:54
Tu as une erreur ici :
$req = "SELECT id, mail, password FROM user WHERE login = '$login' AND mail = '$mail'"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":login", $login, PDO::PARAM_STR); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor();
A corriger par
$req = "SELECT id, mail, password FROM user WHERE login = :login AND mail = :mail "; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":login", $login, PDO::PARAM_STR); $stmt->bindValue(":mail ", $mail , PDO::PARAM_STR); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor();
7 oct. 2022 à 11:29
J'ai modifié comme tu m'as dit, que que tu dis me parais logique à moi aussi je n'avais pas fait gaffe mais j'ai une erreur.
J'ai bien modifié ce que tu m'as dit :
$req = "SELECT id, mail, password FROM user WHERE login = :login AND mail = :mail "; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":login", $login, PDO::PARAM_STR); $stmt->bindValue(":mail ", $mail , PDO::PARAM_STR); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor();
A l'envoi du formulaire j'ai cette erreur qui s'affiche :
la ligne 274 (dans la fonction motDePasseReinitValid($login, $mail)) :
$stmt->execute();
Et donc par la suite je n'ai pas d'email pour la réinitialisation et donc pas d'UPDATE non plus dans ma table
Ouep pardon, c'est sûr que ça parait évident avec le code sous les yeux^^
public function motDePasseReinitValid($login, $mail)
{
$req = "SELECT id, mail, password FROM user WHERE login = :login AND mail = :mail ";
$stmt = $this->getBdd()->prepare($req);
$stmt->bindValue(":login", $login, PDO::PARAM_STR);
$stmt->bindValue(":mail ", $mail , PDO::PARAM_STR);
$stmt->execute(); //ligne 274
$resultat = $stmt->fetch(PDO::FETCH_ASSOC);
$stmt->closeCursor();
7 oct. 2022 à 11:53
Il y a des espaces en trop dans le bind du mail
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionBien vu pour les espaces, j'ai modifié comme ça :
$req = "SELECT id, mail, password FROM user WHERE login = :login AND mail = :mail"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":login", $login, PDO::PARAM_STR); $stmt->bindValue(":mail", $mail , PDO::PARAM_STR); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor();
Puis à l'envoi du formulaire de réinitialisation j'ai cette erreur :
la ligne 310 :
$req = "INSERT INTO reinit_passwd(id_user, key_gen, new_passwd) VALUES(:id_user, :key_gen, :new_password)";
$stmt = $this->getBdd()->prepare($req);
$stmt->bindValue(":id_user", $resultat['id'], PDO::PARAM_STR);
$stmt->bindValue(":key_gen", $key, PDO::PARAM_STR);
$stmt->bindValue(":new_password", $mdp, PDO::PARAM_STR);
$stmt->execute();
$resultat = $stmt->fetch(PDO::FETCH_ASSOC); //ligne 310
$stmt->closeCursor();
var_dump($resultat);
Et la je reçois bien l'email pour la réinitialisation du mdp, sans erreurs
Puis le second mail avec le nouveau mdp et donc même problème il est UPDATE en sha1 dans ma table user.
Modifié le 7 oct. 2022 à 13:55
Tu ne peux pas faire un fetch sur autre chose qu'une requête de type SELECT.
Hors ..la, tu l'as mis sur un insert...
7 oct. 2022 à 13:36
Du coup si j'ai bien compris cette ligne la :
$resultat = $stmt->fetch(PDO::FETCH_ASSOC); //ligne 310
est fausse, de plus elle ne sert à rien je peux donc la supprimer ?
7 oct. 2022 à 13:56
Oui
7 oct. 2022 à 14:37
Okay, j'ai refais un test en supprimant cette ligne, je n'ai plus d'erreur !
on peut enfin voir mon var_dump() :
Donc à la suite de l'envoi du formulaire de réinitialisation ça m'affiche ma variable $resultat que je dump ici :
/Fonction pour réinitialiser son mot de passe public function motDePasseReinitValid($login, $mail) { $req = "SELECT id, mail, password FROM user WHERE login = :login AND mail = :mail"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":login", $login, PDO::PARAM_STR); $stmt->bindValue(":mail", $mail , PDO::PARAM_STR); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); if ($resultat == false) { Toolbox::ajouterMessageAlerte("Combinaison Login / Mail non valide", Toolbox::COULEUR_ROUGE); //header('Location: ' . URL . "users/motdepasse"); var_dump($resultat); //le dump du screen au dessus
Comme on peut le voir c'est bien le mdp haché avec password_hash() que je récupère
Modifié le 7 oct. 2022 à 14:55
Donc c'est bon...
Dans mon premier message :
J'ai toujours dit que le problème c'était l'UPDATE de la table user avec le nouveau mot de passe. En plus à chaque message j'insiste à redire que le problème c'est qui me l'insère en sha1 à l'update (tu peux vérifier).
Donc le problème c'est pourquoi il me l'insère en sha1 à l'update de ma table user ?
7 oct. 2022 à 15:55
Fais un var_dump de la variable $motdepasshash avant l'update
et refais aussi un var_dump de $resultat après l'update
$motdepassetemp = $resultat['new_passwd']; $motdepassehash = password_hash($motdepassetemp, PASSWORD_DEFAULT); //$motdepassehash = hash('sha256',$motdepassetemp); //$motdepassehash = sha1($motdepassetemp); echo "<br> MDP venant de la bdd : " . $motdepassetemp; echo "<br> MDP hash : " . $motdepassehash; // mot de passe hashe correctement ? /* visiblement.. ce code ne sert à rien ici.. autant le déplacer là où il sert ! $req = "SELECT mail FROM user WHERE id = $idtempo"; $stmt = $this->getBdd()->prepare($req); $stmt->execute(); $resultatmail = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); $mailtest = $resultatmail['mail']; */ try{ $req = "UPDATE user SET password = :password WHERE id = :id"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":id", $idtempo, PDO::PARAM_INT); $stmt->bindValue(":password", $motdepassehash, PDO::PARAM_STR); $resultat = $stmt->execute(); $stmt->closeCursor(); var_dump($resultat); // devrais afficher true ou false .. true si mis à jour ! }catch(Exception $e){ echo "Erreur : " . $e->getMessage(); exit; }
7 oct. 2022 à 16:34
J'ai copié ton code comme ça :
//Fonction pour valider la réinitialisation du mot de passe public function motDePasseReinitValidation($key) { $req = "SELECT id, id_user, new_password FROM reinit_passwd WHERE key_gen = '$key'"; $stmt = $this->getBdd()->prepare($req); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); if ($resultat > 0) { $idtempo = $resultat['id_user']; $motdepassetemp = $resultat['new_password']; $motdepassehash = password_hash($motdepassetemp, PASSWORD_DEFAULT); //$motdepassehash = hash('sha256',$motdepassetemp); //$motdepassehash = sha1($motdepassetemp); echo "<br> MDP venant de la bdd : " . $motdepassetemp; echo "<br> MDP hash : " . $motdepassehash; // mot de passe hashe correctement ? /* visiblement.. ce code ne sert à rien ici.. autant le déplacer là où il sert ! $req = "SELECT mail FROM user WHERE id = $idtempo"; $stmt = $this->getBdd()->prepare($req); $stmt->execute(); $resultatmail = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); $mailtest = $resultatmail['mail']; */ try{ $req = "UPDATE user SET password = :password WHERE id = :id"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":id", $idtempo, PDO::PARAM_INT); $stmt->bindValue(":password", $motdepassehash, PDO::PARAM_STR); $resultat = $stmt->execute(); $stmt->closeCursor(); var_dump($resultat); // devrais afficher true ou false .. true si mis à jour ! }catch(Exception $e){ echo "Erreur : " . $e->getMessage(); exit; } // $req = "SELECT mail FROM tng_user WHERE id = $idtempo"; // $stmt = $this->getBdd()->prepare($req); // $stmt->execute(); // $resultatmail = $stmt->fetch(PDO::FETCH_ASSOC); // $stmt->closeCursor(); // $mailtest = $resultatmail['mail']; // $req = "UPDATE user // SET password = :password // WHERE id = :id"; // $stmt = $this->getBdd()->prepare($req); // $stmt->bindValue(":id", $idtempo, PDO::PARAM_INT); // $stmt->bindValue(":password", $motdepassehash, PDO::PARAM_STR); // $resultat = $stmt->execute(); // $stmt->closeCursor(); // var_dump($motdepassehash);
Ce qui est bizarre c'est que j'ai enlevé ce que ta dit qui servait à rien ici et ça na pas fait d'erreur.
J'ai juste vue afficher le même var_dump() que tout à l'heure après l'envoi du formulaire de réinitialisation.
J'ai bien reçu les 2 mails toujours et un UPDATE du mdp en sha1 dans ma table user
Je pense que je ne pourrais pas te répondre avant lundi car j'ai pas mon matos de boulot à la maison mais lundi on pourras reprendre stv bien n'hésite pas à répondre maintenant ou dès que tu vois ce msg je te rep lundi ! encore merci pour l'aide ;)
7 oct. 2022 à 16:51
Est-ce que tu vois les echo que j'ai mis ?
Si tu ne les vois pas... c'est que tu ne passes pas dans cette fonction...
Si tu les vois .. peux nous coller ce qu'ils t'affichent et nous confirmer que l'encodage est bon ?
10 oct. 2022 à 09:03
Re,
J'ai refais un test ce matin avec le même code que dans mon dernier msg.
Donc j'envoi le formulaire de réinitialisation, j'ai mon var_dump qui s'affiche :
Je reçois le premier mail qui m'emmène vers un message d'erreur et je ne reçois don pas le 2eme mail avec le nouveau mdp.
C'est un message d'erreur dans la gestion de mes routes dans mon index.php.
Pour ce qui ai des echo je ne les vois pas mais ça reste étrange pcq l'update se faisait bien dans la table même si c'était pas le bon.
10 oct. 2022 à 09:15
ce n'est pas possible que tu ne vois pas les echos .. sauf si tu as oublié de retirer une redirection....
A la limite, place un exit après les echo.
Si tu ne les vois toujours pas... c'est que tu ne passes pas dans cette fonction !
J'ai refais le test du coup avec un exit à ce niveau là :
if ($resultat > 0) { $idtempo = $resultat['id_user']; $motdepassetemp = $resultat['new_password']; $motdepassehash = password_hash($motdepassetemp, PASSWORD_DEFAULT); //$motdepassehash = hash('sha256',$motdepassetemp); //$motdepassehash = sha1($motdepassetemp); echo "<br> MDP venant de la bdd : " . $motdepassetemp; echo "<br> MDP hash : " . $motdepassehash; // mot de passe hashe correctement ? exit;
Aucun changement, j'ai pas vu d'echo (même résultat que le test au dessus).
Je me demandais si peut être ça pouvait poser problème, dans mon controller ou j'appel ces fonctions j'instancie une fonction qui a le même nom qu'une autre dans mon user manager :
Mon controller :
public function motDePasseReinitValid($key) { $this->userManager->motDePasseReinitValidation($key); }
Mon userManager :
public function motDePasseReinitValid($login, $mail) { $req = "SELECT id, mail, password FROM user WHERE login = :login AND mail = :mail"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":login", $login, PDO::PARAM_STR); $stmt->bindValue(":mail", $mail , PDO::PARAM_STR); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); if ($resultat == false) { Toolbox::ajouterMessageAlerte("Combinaison Login / Mail non valide", Toolbox::COULEUR_ROUGE); //header('Location: ' . URL . "users/motdepasse"); var_dump($resultat); } else { $char = '1234567890abcdefghijklmnopqrstuvwxyz0123456789'; $key = str_shuffle($char); $longueur = '8'; $possible = '123456789abcdfghjkmnpqrtvwxyzABCDFGHJKLMNPQRTVWXYZ'; $mdp = ''; // cette valeur sera utilisé plus tard $longueurMax = strlen($possible); if ($longueur > $longueurMax) { $longueur = $longueurMax; } $i = 0; while ($i < $longueur) { // prend un caractère aléatoire $caractere = substr($possible, mt_rand(0, $longueurMax - 1), 1); $mdp .= $caractere; $i++; } $req = "INSERT INTO reinit_passwd(id_user, key_gen, new_password) VALUES(:id_user, :key_gen, :new_password)"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":id_user", $resultat['id'], PDO::PARAM_STR); $stmt->bindValue(":key_gen", $key, PDO::PARAM_STR); $stmt->bindValue(":new_password", $mdp, PDO::PARAM_STR); $stmt->execute(); $stmt->closeCursor(); var_dump($resultat); //=====Déclaration des messages au format texte et au format HTML. $passage_ligne = "\r\n"; $message_txt = "Bonjour, vous avez fait une demande de nouveau mot de passe pour le Portail."; $message_html = "<html><head></head><body>Bonjour,<br /><br /> Vous avez fait une demande de nouveau mot de passe pour <b>le Portail</b>.<br /><br />Pour confirmer la réinitialisation du mot de passe, merci de cliquer sur le lien ci-dessous : <br /><br /><a href=\"http://dns.fr/portail_/users/motdepassereinitvalid/" . $key . "\">http://dns.fr/portail_/users/motdepassereinitvalid/" . $key . "<a/></body></html>"; //========== //=====Création de la boundary. $boundary = "-----=" . md5(rand()); $boundary_alt = "-----=" . md5(rand()); //========== //=====Définition du sujet. $sujet = "Portail - Mot de passe oubli". chr(233); //========= //=====Création du header de l'e-mail. $header = "From: \"Portail Bl\"<mail.xxx.com>" . $passage_ligne; $header .= "Reply-to: \"Portail \" <mail.xxx.com>" . $passage_ligne; $header .= "MIME-Version: 1.0" . $passage_ligne; $header .= "Content-Type: multipart/mixed;" . $passage_ligne . " boundary=\"$boundary\"" . $passage_ligne; //========== //=====Création du message. $message = $passage_ligne . "--" . $boundary . $passage_ligne; $message .= "Content-Type: multipart/alternative;" . $passage_ligne . " boundary=\"$boundary_alt\"" . $passage_ligne; $message .= $passage_ligne . "--" . $boundary_alt . $passage_ligne; //=====Ajout du message au format texte. $message .= "Content-Type: text/plain; charset=\"ISO-8859-1\"" . $passage_ligne; $message .= "Content-Transfer-Encoding: 8bit" . $passage_ligne; $message .= $passage_ligne . $message_txt . $passage_ligne; //========== $message .= $passage_ligne . "--" . $boundary_alt . $passage_ligne; //=====Ajout du message au format HTML. $message .= "Content-Type: text/html; charset=\"ISO-8859-1\"" . $passage_ligne; $message .= "Content-Transfer-Encoding: 8bit" . $passage_ligne; $message .= $passage_ligne . $message_html . $passage_ligne; //========== //=====On ferme la boundary alternative. $message .= $passage_ligne . "--" . $boundary_alt . "--" . $passage_ligne; $message .= $passage_ligne . "--" . $boundary . $passage_ligne; //========== if (mail($mail, $sujet, $message, $header)) { Toolbox::ajouterMessageAlerte("Un mail pour la réinitialisation du mot de passe vient de vous être envoyé", Toolbox::COULEUR_VERTE); //header('Location: ' . URL); } else { Toolbox::ajouterMessageAlerte("Echec de l'envoi du mail. Essayez de recommencer. Si le problème persiste, contactez la cellule SI", Toolbox::COULEUR_ROUGE); } } }
je sais pas si ça peut avoir une incidence car ils ont pas les même paramètres, de plus ce n'est pas cette fonction que je fais mon update de ma table user
10 oct. 2022 à 09:48
Alors... encore une fois .. juste avec des petits bouts de code... impossible d'avoir une vision assez complète de comment fonctionne ton code...
Il faudrait nous coller l'intégralité de tes fichiers, en indiquant, pour chacune d'eux, leur nom !
Mais j'insiste ... si tu ne vois pas les echos .. c'est que tu ne passes pas dans cette fonction. Donc normal que ça n'update pas comme tu le veux !
Modifié le 10 oct. 2022 à 11:53
Okay
voila l'intégralité de ma page userManager.class.php :
<?php use LDAP\Result; require_once 'Model.class.php'; require_once 'User.class.php'; class UserManager extends Model { private $user; //Tableau de vdc public function ajoutUser($user) { $this->users[] = $user; } public function getUser() { return $this->users; } // Fonction qui charge tous les utilisateurs de la bdd. public function chargementUsers() { $req = $this->getBdd()->prepare( 'SELECT id, login,password, mail, admin, bl, dist, NomPrenom, demandevalidation , pilote, rs FROM user' ); $req->execute(); $donnees = $req->fetchAll(PDO::FETCH_ASSOC); $req->closeCursor(); // Code erreur: #UM01 if (!empty($donnees)) { foreach ($donnees as $donnees_users) { $q = new User( $donnees_users['id'], $donnees_users['login'], $donnees_users['password'], $donnees_users['mail'], $donnees_users['admin'], $donnees_users['bl'], $donnees_users['dist'], $donnees_users['NomPrenom'], $donnees_users['demandevalidation'], $donnees_users['pilote'], $donnees_users['rs'] ); $this->ajoutUser($q); } } else { Toolbox::ajouterMessageAlerte("Echec du chargement des utilisateurs - Code erreur : #UM01", Toolbox::COULEUR_ROUGE); header('Location: ' . URL); } } // Fonction pour un utilisateur en fonction de son id public function getUserById($id) { for ($i = 0; $i < count($this->users); $i++) { if ($this->users[$i]->getId() === $id) { return $this->users[$i]; } } } // Fonction pour cherche le mot de passe d'un utilisateur en fonction de son CUID private function getPasswordUser($login) { $req = "SELECT password FROM user WHERE login = :login"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":login", $login, PDO::PARAM_STR); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); // Code erreur: #UM03 if ($resultat != false) { return $resultat['password']; } else { //à décommenter lors du passage en prod et commenter la ligne en dessous Toolbox::ajouterMessageAlerte("Echec de la requête", Toolbox::COULEUR_ROUGE); Toolbox::ajouterMessageAlerte("Echec de la requête - Code erreur: #UM03", Toolbox::COULEUR_ROUGE); header("location: " . URL); } } // Fonction qui compare le mot de passe de la bdd et celui rentré par l'utilisateur public function isCombinaisonValide($login, $password) { //$password = hash('sha256',$password); //$password = sha1($password); $passwordBD = $this->getPasswordUser($login); // Code erreur: #UM04 if (password_verify($password, $passwordBD)) { return true; } else { // à décommenter lors du passage en prod et commenter la ligne en dessous Toolbox::ajouterMessageAlerte("Echec lors de la connexion", Toolbox::COULEUR_ROUGE); Toolbox::ajouterMessageAlerte("Echec de la comparaison - Code erreur: #UM04", Toolbox::COULEUR_ROUGE); return false; } } // Fonction qui ajoute un utilisateur à la bdd public function ajoutUserBd( $login, $password, $mail, $admin, $bl, $dist, $NomPrenom, $demandevalidation, $pilote, $rs ) { $login = strip_tags($login); $password = strip_tags($password); $mail = strip_tags($mail); $admin = strip_tags($admin); $bl = strip_tags($bl); $dist = strip_tags($dist); $NomPrenom = strip_tags($NomPrenom); $demandevalidation = strip_tags($demandevalidation); $pilote = strip_tags($pilote); $rs = strip_tags($rs); $hashed_password = password_hash($password, PASSWORD_DEFAULT); //$password = hash('sha256',$password); //$password = sha1($password); $req = "INSERT INTO user(login, password, mail, admin, bl, dist, NomPrenom, demandevalidation, pilote, rs) VALUES(:login, :password, :mail, :admin, :bl, :dist, :NomPrenom, :demandevalidation, :pilote, :rs)"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":login", $login, PDO::PARAM_STR); $stmt->bindValue(":password", $hashed_password, PDO::PARAM_STR); $stmt->bindValue(":mail", $mail, PDO::PARAM_STR); $stmt->bindValue(":admin", $admin); $stmt->bindValue(":bl", $bl); $stmt->bindValue(":dist", $dist, PDO::PARAM_STR); $stmt->bindValue(":NomPrenom", $NomPrenom, PDO::PARAM_STR); $stmt->bindValue(":demandevalidation", $demandevalidation, PDO::PARAM_STR); $stmt->bindValue(":pilote", $pilote, PDO::PARAM_STR); $stmt->bindValue(":rs", $rs, PDO::PARAM_STR); $resultat = $stmt->execute(); $stmt->closeCursor(); // Code erreur: #UM05 if ($resultat > 0) { $user = new User( $this->getBdd()->lastInsertId(), $login, $password, $mail, $admin, $bl, $dist, $NomPrenom, $demandevalidation, $pilote, $rs ); $this->ajoutUser($user); Toolbox::ajouterMessageAlerte("Ajout de l'utilisateur réussi", Toolbox::COULEUR_VERTE); } else { Toolbox::ajouterMessageAlerte("Echec de l'ajout d'un utilisateur - Code erreur: #UM05", Toolbox::COULEUR_ROUGE); header('Location: ' . URL . "users"); } } // Fonction de la modification d'un utilisateur public function modificationUserBd( $id, $login, $mail, $admin, $bl, $dist, $NomPrenom, $demandevalidation, $pilote, $rs ) { $login = strip_tags($login); $mail = strip_tags($mail); $admin = strip_tags($admin); $bl = strip_tags($bl); $dist = strip_tags($dist); $NomPrenom = strip_tags($NomPrenom); $demandevalidation = strip_tags($demandevalidation); $pilote = strip_tags($pilote); $rs = strip_tags($rs); $req = "UPDATE user set login = :login, mail = :mail, admin = :admin, bl = :bl, dist = :dist, NomPrenom = :NomPrenom, demandevalidation = :demandevalidation, pilote = :pilote, rs = :rs WHERE id = :id"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":id", $id, PDO::PARAM_INT); $stmt->bindValue(":login", $login, PDO::PARAM_STR); $stmt->bindValue(":mail", $mail, PDO::PARAM_STR); $stmt->bindValue(":admin", $admin, PDO::PARAM_STR); $stmt->bindValue(":bl", $bl); $stmt->bindValue(":dist", $dist); $stmt->bindValue(":NomPrenom", $NomPrenom, PDO::PARAM_STR); $stmt->bindValue(":demandevalidation", $demandevalidation); $stmt->bindValue(":pilote", $pilote); $stmt->bindValue(":rs", $rs); $resultat = $stmt->execute(); $stmt->closeCursor(); if ($resultat > 0) { $this->getUserById($id)->setLogin($login); $this->getUserById($id)->setMail($mail); $this->getUserById($id)->setAdmin($admin); $this->getUserById($id)->setBl($bl); $this->getUserById($id)->setDist($dist); $this->getUserById($id)->setNomPrenom($NomPrenom); $this->getUserById($id)->setDemandeValidation($demandevalidation); $this->getUserById($id)->setPilote($pilote); $this->getUserById($id)->setRs($rs); } } public function getUserInformation($login) { $req = "SELECT * FROM user WHERE login = :login"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":login", $login, PDO::PARAM_STR); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); return $resultat; } public function deleteUserBd($id) { $req = " Delete from `user` where `id` = " . $id . " "; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":id", $id, PDO::PARAM_INT); $stmt->execute(); $stmt->closeCursor(); Toolbox::ajouterMessageAlerte("La suppression a été effectuée", Toolbox::COULEUR_VERTE); } //Fonction pour réinitialiser son mot de passe public function motDePasseReinitValid($login, $mail) { $req = "SELECT id, mail, password FROM user WHERE login = :login AND mail = :mail"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":login", $login, PDO::PARAM_STR); $stmt->bindValue(":mail", $mail , PDO::PARAM_STR); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); if ($resultat == false) { Toolbox::ajouterMessageAlerte("Combinaison Login / Mail non valide", Toolbox::COULEUR_ROUGE); //header('Location: ' . URL . "users/motdepasse"); var_dump($resultat); } else { $char = '1234567890abcdefghijklmnopqrstuvwxyz0123456789'; $key = str_shuffle($char); $longueur = '8'; //Ne fonctionne pas si on la met à 12 $possible = '123456789abcdfghjkmnpqrtvwxyzABCDFGHJKLMNPQRTVWXYZ'; $mdp = ''; // cette valeur sera utilisé plus tard $longueurMax = strlen($possible); if ($longueur > $longueurMax) { $longueur = $longueurMax; } $i = 0; while ($i < $longueur) { // prend un caractère aléatoire $caractere = substr($possible, mt_rand(0, $longueurMax - 1), 1); $mdp .= $caractere; $i++; } $req = "INSERT INTO reinit_passwd(id_user, key_gen, new_password) VALUES(:id_user, :key_gen, :new_password)"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":id_user", $resultat['id'], PDO::PARAM_STR); $stmt->bindValue(":key_gen", $key, PDO::PARAM_STR); $stmt->bindValue(":new_password", $mdp, PDO::PARAM_STR); $stmt->execute(); $stmt->closeCursor(); var_dump($resultat); //=====Déclaration des messages au format texte et au format HTML. $passage_ligne = "\r\n"; $message_txt = "Bonjour, vous avez fait une demande de nouveau mot de passe pour le Portail."; $message_html = "<html><head></head><body>Bonjour,<br /><br /> Vous avez fait une demande de nouveau mot de passe pour <b>le Portail</b>.<br /><br />Pour confirmer la réinitialisation du mot de passe, merci de cliquer sur le lien ci-dessous : <br /><br /><a href=\"http://dns.fr/portail/users/motdepassereinitvalid/" . $key . "\">http://dns.fr/portail/users/motdepassereinitvalid/" . $key . "<a/></body></html>"; //========== //=====Création de la boundary. $boundary = "-----=" . md5(rand()); $boundary_alt = "-----=" . md5(rand()); //========== //=====Définition du sujet. $sujet = "Portail - Mot de passe oubli". chr(233); //========= //=====Création du header de l'e-mail. $header = "From: \"Portail\"<mail.xxx.com>" . $passage_ligne; $header .= "Reply-to: \"Portail \" <mail.xxx.com>" . $passage_ligne; $header .= "MIME-Version: 1.0" . $passage_ligne; $header .= "Content-Type: multipart/mixed;" . $passage_ligne . " boundary=\"$boundary\"" . $passage_ligne; //========== //=====Création du message. $message = $passage_ligne . "--" . $boundary . $passage_ligne; $message .= "Content-Type: multipart/alternative;" . $passage_ligne . " boundary=\"$boundary_alt\"" . $passage_ligne; $message .= $passage_ligne . "--" . $boundary_alt . $passage_ligne; //=====Ajout du message au format texte. $message .= "Content-Type: text/plain; charset=\"ISO-8859-1\"" . $passage_ligne; $message .= "Content-Transfer-Encoding: 8bit" . $passage_ligne; $message .= $passage_ligne . $message_txt . $passage_ligne; //========== $message .= $passage_ligne . "--" . $boundary_alt . $passage_ligne; //=====Ajout du message au format HTML. $message .= "Content-Type: text/html; charset=\"ISO-8859-1\"" . $passage_ligne; $message .= "Content-Transfer-Encoding: 8bit" . $passage_ligne; $message .= $passage_ligne . $message_html . $passage_ligne; //========== //=====On ferme la boundary alternative. $message .= $passage_ligne . "--" . $boundary_alt . "--" . $passage_ligne; $message .= $passage_ligne . "--" . $boundary . $passage_ligne; //========== if (mail($mail, $sujet, $message, $header)) { Toolbox::ajouterMessageAlerte("Un mail pour la réinitialisation du mot de passe vient de vous être envoyé", Toolbox::COULEUR_VERTE); //header('Location: ' . URL); } else { Toolbox::ajouterMessageAlerte("Echec de l'envoi du mail. Essayez de recommencer. Si le problème persiste, contactez la cellule SI", Toolbox::COULEUR_ROUGE); } } } //Fonction pour valider la réinitialisation du mot de passe public function motDePasseReinitValidation($key) { $req = "SELECT id, id_user, new_password FROM reinit_passwd WHERE key_gen = '$key'"; $stmt = $this->getBdd()->prepare($req); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); if ($resultat > 0) { $idtempo = $resultat['id_user']; $motdepassetemp = $resultat['new_password']; $motdepassehash = password_hash($motdepassetemp, PASSWORD_DEFAULT); //$motdepassehash = hash('sha256',$motdepassetemp); //$motdepassehash = sha1($motdepassetemp); echo "<br> MDP venant de la bdd : " . $motdepassetemp; echo "<br> MDP hash : " . $motdepassehash; // mot de passe hashe correctement ? exit; /* visiblement.. ce code ne sert à rien ici.. autant le déplacer là où il sert ! $req = "SELECT mail FROM user WHERE id = $idtempo"; $stmt = $this->getBdd()->prepare($req); $stmt->execute(); $resultatmail = $stmt->fetch(PDO::FETCH_ASSOC); $stmt->closeCursor(); $mailtest = $resultatmail['mail']; */ try{ $req = "UPDATE user SET password = :password WHERE id = :id"; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":id", $idtempo, PDO::PARAM_INT); $stmt->bindValue(":password", $motdepassehash, PDO::PARAM_STR); $resultat = $stmt->execute(); $stmt->closeCursor(); var_dump($resultat); // devrais afficher true ou false .. true si mis à jour ! }catch(Exception $e){ echo "Erreur : " . $e->getMessage(); exit; } // $req = "SELECT mail FROM user WHERE id = $idtempo"; // $stmt = $this->getBdd()->prepare($req); // $stmt->execute(); // $resultatmail = $stmt->fetch(PDO::FETCH_ASSOC); // $stmt->closeCursor(); // $mailtest = $resultatmail['mail']; // $req = "UPDATE user // SET password = :password // WHERE id = :id"; // $stmt = $this->getBdd()->prepare($req); // $stmt->bindValue(":id", $idtempo, PDO::PARAM_INT); // $stmt->bindValue(":password", $motdepassehash, PDO::PARAM_STR); // $resultat = $stmt->execute(); // $stmt->closeCursor(); // var_dump($motdepassehash); $req = " DELETE FROM reinit_passwd WHERE id_user = $idtempo "; $stmt = $this->getBdd()->prepare($req); $stmt->bindValue(":id_user", $idtempo, PDO::PARAM_INT); $resultatdelete = $stmt->execute(); $stmt->closeCursor(); //=====Déclaration des messages au format texte et au format HTML. $passage_ligne = "\r\n"; $message_txt = "Bonjour, vous avez réinitialisé votre mot de passe pour le Portail."; $message_html = "<html><head></head><body>Bonjour,<br /><br /> Vous avez réinitialisé votre mot de passe.<br /><br /> Nouveau mot de passe : " . $motdepassetemp . "<a/></body></html>"; //========== //=====Création de la boundary. $boundary = "-----=" . md5(rand()); $boundary_alt = "-----=" . md5(rand()); //========== //=====Définition du sujet. $sujet = "Portail - Nouveau mot de passe"; //========= //=====Création du header de l'e-mail. $header = "From: \"Portail\"<mail.xxx.com>" . $passage_ligne; $header .= "Reply-to: \"Portail\"<mail.xxx.com>" . $passage_ligne; $header .= "MIME-Version: 1.0" . $passage_ligne; $header .= "Content-Type: multipart/mixed;" . $passage_ligne . " boundary=\"$boundary\"" . $passage_ligne; //========== //=====Création du message. $message = $passage_ligne . "--" . $boundary . $passage_ligne; $message .= "Content-Type: multipart/alternative;" . $passage_ligne . " boundary=\"$boundary_alt\"" . $passage_ligne; $message .= $passage_ligne . "--" . $boundary_alt . $passage_ligne; //=====Ajout du message au format texte. $message .= "Content-Type: text/plain; charset=\"ISO-8859-1\"" . $passage_ligne; $message .= "Content-Transfer-Encoding: 8bit" . $passage_ligne; $message .= $passage_ligne . $message_txt . $passage_ligne; //========== $message .= $passage_ligne . "--" . $boundary_alt . $passage_ligne; //=====Ajout du message au format HTML. $message .= "Content-Type: text/html; charset=\"ISO-8859-1\"" . $passage_ligne; $message .= "Content-Transfer-Encoding: 8bit" . $passage_ligne; $message .= $passage_ligne . $message_html . $passage_ligne; //========== //=====On ferme la boundary alternative. $message .= $passage_ligne . "--" . $boundary_alt . "--" . $passage_ligne; $message .= $passage_ligne . "--" . $boundary . $passage_ligne; //========== //=====Envoi de l'e-mail. if (mail($mailtest, $sujet, $message, $header) && ($resultatdelete != false) && ($resultat != false) && ($resultatmail != false)) { Toolbox::ajouterMessageAlerte("Votre mot de passe a bien été réinitialisé", Toolbox::COULEUR_VERTE); //header('Location: ' . URL); } else { Toolbox::ajouterMessageAlerte("Echec de la réinitialisation du mot de passe - Code erreur : #UM01", Toolbox::COULEUR_ROUGE); //header('Location: ' . URL . "users/motdepasse"); } } else { Toolbox::ajouterMessageAlerte("Le lien n'a pas été approuvé par notre site. Veuillez réessayer. Code erreur : #UM02", Toolbox::COULEUR_ROUGE); //header('Location: ' . URL . "users/motdepasse"); } } }
Ma page userController.php :
<?php require_once "models/UserManager.class.php"; class UserController { public $userManager; public function __construct() { $this->userManager = new UserManager; $this->userManager->chargementUsers(); } public function afficherUsers() { $users = $this->userManager->getUser(); require "views/user/users.view.php"; } public function modificationUser($id) { $user = $this->userManager->getUserById($id); require "views/user/updateUser.view.php"; } public function ajoutUser() { require "views/user/createUser.view.php"; } public function motDePasseOublie() { require "views/motDePasseOublie.view.php"; } public function ajoutuserValidation() { if ($_POST['bl'] != 'on') { $_POST['bl'] = 0; } else { $_POST['bl'] = 1; } if ($_POST['dist'] != 'on') { $_POST['dist'] = 0; } else { $_POST['dist'] = 1; } if ($_POST['admin'] != 'on') { $_POST['admin'] = 0; } else { $_POST['admin'] = 1; } if ($_POST['demandevalidation'] != 'on') { $_POST['demandevalidation'] = 0; } else { $_POST['demandevalidation'] = 1; } if ($_POST['pilote'] != 'on') { $_POST['pilote'] = 0; } else { $_POST['pilote'] = 1; } if ($_POST['rs'] != 'on') { $_POST['rs'] = 0; } else { $_POST['rs'] = 1; } if ($_POST['password'] === $_POST['passwordverif']) { $this->userManager->ajoutUserBd( $_POST['login'], $_POST['password'], $_POST['mail'], $_POST['admin'], $_POST['bl'], $_POST['dist'], $_POST['NomPrenom'], $_POST['demandevalidation'], $_POST['pilote'], $_POST['rs'] ); header('Location: ' . URL . "users"); } else { Toolbox::ajouterMessageAlerte("Les mots de passe ne sont pas les mêmes", Toolbox::COULEUR_ROUGE); } } public function modificationUserValidation() { if ($_POST['bl'] != 'on') { $_POST['bl'] = 0; } else { $_POST['bl'] = 1; } if ($_POST['dist'] != 'on') { $_POST['dist'] = 0; } else { $_POST['dist'] = 1; } if ($_POST['admin'] != 'on') { $_POST['admin'] = 0; } else { $_POST['admin'] = 1; } if ($_POST['demandevalidation'] != 'on') { $_POST['demandevalidation'] = 0; } else { $_POST['demandevalidation'] = 1; } if ($_POST['pilote'] != 'on') { $_POST['pilote'] = 0; } else { $_POST['pilote'] = 1; } if ($_POST['rs'] != 'on') { $_POST['rs'] = 0; } else { $_POST['rs'] = 1; } $this->userManager->modificationUserBd( $_POST['id'], $_POST['login'], $_POST['mail'], $_POST['admin'], $_POST['bl'], $_POST['dist'], $_POST['NomPrenom'], $_POST['demandevalidation'], $_POST['pilote'], $_POST['rs'] ); Toolbox::ajouterMessageAlerte("La modification a été effectuée avec succès", Toolbox::COULEUR_VERTE); header('Location: ' . URL . "users"); } public function motDePasseReinit() { if ((!empty($_POST['login'])) && (!empty($_POST['mail']))) { $this->userManager->motDePasseReinitValid( $_POST['login'], $_POST['mail'] ); } else { Toolbox::ajouterMessageAlerte("Combinaison Login / Mail non valide", Toolbox::COULEUR_ROUGE); header('Location: ' . URL . "users/motdepasse"); } } public function motDePasseReinitValid($key) { $this->userManager->motDePasseReinitValidation($key); } public function login() { require "views/login.view.php"; } public function validation_login($login, $password) { if ($this->userManager->isCombinaisonValide($login, $password)) { Toolbox::ajouterMessageAlerte("Bon retour sur le portail " . $login . " ! AJOUT DU SYSTEME DE FILTRE POUR LES INCIDENTS" , Toolbox::COULEUR_VERTE); $_SESSION['profil'] = [ "login" => $login, ]; $datas = $this->userManager->getUserInformation($_SESSION['profil']['login']); $_SESSION['profil']["bl"] = $datas['bl']; $_SESSION['profil']["dist"] = $datas['dist']; $_SESSION['profil']["admin"] = $datas['admin']; $_SESSION['profil']["demandevalidation"] = $datas['demandevalidation']; $_SESSION['profil']["pilote"] = $datas['pilote']; $_SESSION['profil']["rs"] = $datas['rs']; if (Securite::estConnecte() && Securite::estBl()) { header("Location: " . URL . "tngs"); } else { header("Location: " . URL . "accueil"); } } else { Toolbox::ajouterMessageAlerte("Combinaison Login / Mot de passe non valide", Toolbox::COULEUR_ROUGE); //header("location: " . URL); var_dump($password); } } public function profil() { $datas = $this->userManager->getUserInformation($_SESSION['profil']['login']); $_SESSION['profil']["bl"] = $datas['bl']; $_SESSION['profil']["dist"] = $datas['dist']; $_SESSION['profil']["admin"] = $datas['admin']; $_SESSION['profil']["demandevalidation"] = $datas['demandevalidation']; $_SESSION['profil']["pilote"] = $datas['pilote']; $_SESSION['profil']["rs"] = $datas['rs']; } public function deconnexion() { $domain = ($_SERVER['HTTP_HOST'] != 'localhost') ? $_SERVER['HTTP_HOST'] : false; Toolbox::ajouterMessageAlerte("La deconnexion est effectuée", Toolbox::COULEUR_VERTE); unset($_SESSION['profil']); setcookie(Securite::COOKIE_NAME,"",time() - 3600, '/', $domain, false, true); header("Location: " . URL); // Toolbox::ajouterMessageAlerte("La deconnexion est effectuée", Toolbox::COULEUR_VERTE); // unset($_SESSION['profil']); // setcookie(Securite::COOKIE_NAME,"",time() - 3600, httpOnly); // header("Location: " . URL); } public function deleteUser($id) { $this->userManager->deleteUserBd($id); header('Location: ' . URL . "users"); } }
J'suis allé voir aussi côté base de données pour voir si y'avait pas une config spécial sur ma colonne password de ma table user, mais rien d'anormales :