1. Ce site utilise des cookies. En continuant à utiliser ce site, vous acceptez l'utilisation des cookies. En savoir plus.

CORBEILLE Changement de mot de passe

Discussion dans 'Les tréfonds du forum' créé par MrSheepSheep, 6 Avril 2015.

MineStrator, Votre hébergeur de serveur minecraft
  1. MrSheepSheep

    MrSheepSheep Caporal

    130
    74
    28
    Bonjour,
    je viens parler d'un bug assez important je trouve. Lorsque je souhaite modifier le mot de passe de mon compte (cela vaut pour n'importe quel autre compte, admin ou pas), j'atterris sur une erreur de code 3 (?erreur=3).

    A en juger du code suivant:
    Code:
    if(VerifieMdp($mdpAncien, $mdpNouveau, $mdpConfirme, $_Joueur_['pseudo'], $bddConnection))
        ChangeMdp($mdpNouveau, $_Joueur_['pseudo'], $bddConnection);
    else
        header('Location: ?&page=profil&profil=' .$_Joueur_['pseudo']. '&erreur=3');
    
    La comparaison entre le mot de passe actuel entré et celui sauvegardé dans la base de données est fausse. Les mots de passe sont considérés comme différents.
    J'ai donc quand même fait mes tests. En utilisant un die($mdpAncien), j'ai pu vérifier que les mots de passe étaient bons.
    J'ai continué mes tests avec un die(), cette fois dans la vérification du mot de passe stocké dans la base de données, et celui entré dans la fonction:
    Code:
    function VerifieMdp($mdp, $mdpNew, $mdpConfirm, $pseudo, $bddConnection)
    {
       require_once('modele/joueur/maj.class.php');
       $maj = new Maj($pseudo, $bddConnection);
       $maj = $maj->getReponseConnection();
       $maj = $maj->fetch();
       die($mdp.' >>> '.$maj['mdp']);
       if($maj['mdp'] == $mdp)
         return true;
       else
         return false;
    }
    
    Ce code retourne deux valeurs différentes, en effet:
    $mdp = le mot de passe rentré, brut
    $maj['mdp'] = le mot de passe de la base de données, hashé.
    J'en déduis donc que $mdp doit être hashé avant d'être comparé.

    Du coup, je me suis permis quelques manipulations: j'ai changé le mot de passe hashé de la base de données par mon mot de passe brut (je travaille en local). Et là, magie, je peux changer de mot de passe ! Et la magie va jusqu'au bout: le mot de passe changé apparaît en brut dans la base de données.

    Est-ce un bug qui vient de chez moi (de la base de données), ou c'est le cas pour tout le monde ?
    Sinon, est-ce que cette fonctionnalité n'est pas entièrement implémentée ? J'ai remarqué qu'il n'y a même pas de redirection vers un message de confirmation après que le mot de passe soit changé. De plus, il y a des changements bizarres qui se font:
    Code:
    $_Joueur_['pseudo'] = $email;
    
    Voilà pour ce bug, j'espère trouver une solution assez rapidement. Sinon je vais être obligé de supprimer les comptes de mes utilisateurs pour qu'ils changent leur mot de passe...
     
    Dernière édition: 6 Avril 2015
  2. Vladort

    Vladort Fondateur CMW Staff Fondateur

    815
    373
    63
    J'ai en effet aussi le bug de refus de changement de mot de passe je cherche actuellement une solution.
    Je met ce bug en tête de liste pour la prochaine MAJ.
     
  3. MrSheepSheep

    MrSheepSheep Caporal

    130
    74
    28
    Ok, je cherche quand même une solution de mon côté, des fois que.
     
  4. Vladort

    Vladort Fondateur CMW Staff Fondateur

    815
    373
    63
    Je pense que je vais récrire une partie du code a ce niveau en même temps que le système de récupération du mot de passe par mail &/ou serveur.
     
  5. MrSheepSheep

    MrSheepSheep Caporal

    130
    74
    28
    J'ai la solution.
    Voici les deux fonctions que j'ai modifié:

    Code:
    function VerifieMdp($mdp, $mdpNew, $mdpConfirm, $pseudo, $bddConnection)
    {
       require_once('modele/joueur/maj.class.php');
       $maj = new Maj($pseudo, $bddConnection);
       $maj = $maj->getReponseConnection();
       $maj = $maj->fetch();
       $mdp = md5(sha1($mdp));
       if($maj['mdp'] == $mdp)
         return true;
       else
         return false;
    }
    
    Code:
    function ChangeMdp($mdp, $pseudo, $bddConnection)
    {
       require_once('modele/joueur/maj.class.php');
       $maj = new Maj($pseudo, $bddConnection);
       $mdp = md5(sha1($mdp));
       $maj->setNouvellesDonneesMdp($mdp);
    }
    
    C'était beaucoup plus simple que je ne le pensais... Reste à savoir si ce bug intervient sur tous les sites, ou si il y a des cas particuliers.
     
    Dernière édition: 6 Avril 2015
  6. Vladort

    Vladort Fondateur CMW Staff Fondateur

    815
    373
    63
    Ta fonction marche bien mais il faut ajouter un session_destroy() en plus pour le forcer a ce relogin avec le nouveau mot de passe MAIS ton code change la valeur de l'email a "1"
    Je pense que le problème vient que sa ne récupère pas le POST de l'email mais l'ID du joueur.

    A voir
     
  7. MrSheepSheep

    MrSheepSheep Caporal

    130
    74
    28
    De mon côté, le mail ne change pas. Je mets mon code du changeProfil.php complet demain pour qu'on voie ça.
     
  8. Vladort

    Vladort Fondateur CMW Staff Fondateur

    815
    373
    63
    Moi sa me le remplace par "1" ._.
     
  9. MrSheepSheep

    MrSheepSheep Caporal

    130
    74
    28
    Voilà le code de mon fichier changeProfil.php :
    Code:
    <?php
    $email = VerifieDonnee($_POST['email']);
    $mdpAncien = VerifieDonnee($_POST['mdpAncien']);
    $mdpNouveau = VerifieDonnee($_POST['mdpNouveau']);
    $mdpConfirme = VerifieDonnee($_POST['mdpConfirme']);
    
    if($email == 1)
       header('Location: ?&page=profil&profil=' .$_Joueur_['pseudo']. '&erreur=1');
    if($email == 2 OR $mdpNouveau == 2 OR $mdpAncien == 2 OR $mdpConfirme == 2)
       header('Location: ?&page=profil&profil=' .$_Joueur_['pseudo']. '&erreur=2');
    if(VerifieMdp($mdpAncien, $mdpNouveau, $mdpConfirme, $_Joueur_['pseudo'], $bddConnection)){
       ChangeMdp($mdpNouveau, $_Joueur_['pseudo'], $bddConnection);
       }
    else
    {
       header('Location: ?&page=profil&profil=' .$_Joueur_['pseudo']. '&erreur=3');
    }
    
    if($mdpNouveau == 1 OR $mdpAncien == 1 OR $mdpConfirme == 1)
       ValideChangement($email, $_Joueur_['pseudo'], $bddConnection);
    
    $_SESSION['Player']['email'] = $email;
    header('Location: ?&page=profil&profil='.$_Joueur_['pseudo'].'&changeProfil=success');
    
    function VerifieMdp($mdp, $mdpNew, $mdpConfirm, $pseudo, $bddConnection)
    {
       require_once('modele/joueur/maj.class.php');
       $maj = new Maj($pseudo, $bddConnection);
       $maj = $maj->getReponseConnection();
       $maj = $maj->fetch();
       $mdp = md5(sha1($mdp));
       if($maj['mdp'] == $mdp)
         return true;
       else
         return false;
    }
    
    function VerifieDonnee($donnee)
    {
       if(!isset($donnee) OR empty($donnee))
         return 1;
       if(strlen($donnee) < 6)
         return 2;
       $donnee = str_replace(' ', '_', $donnee);
       $donnee = htmlspecialchars($donnee);
       return $donnee;
    }
    
    function ValideChangement($email, $pseudo, $bddConnection)
    {
       require_once('modele/joueur/maj.class.php');
       $maj = new Maj($pseudo, $bddConnection);
       $maj->setNouvellesDonneesEmail($email);
    }
    function ChangeMdp($mdp, $pseudo, $bddConnection)
    {
       require_once('modele/joueur/maj.class.php');
       $maj = new Maj($pseudo, $bddConnection);
       $mdp = md5(sha1($mdp));
       $maj->setNouvellesDonneesMdp($mdp);
    }
    ?>
    
     
  10. Xx_Will33_xX

    Xx_Will33_xX Soldat

    45
    2
    8
    Le système de récupération de mots de passe ne fonctionne pas sur mon site, es normal, un bug ?
     
  11. MrSheepSheep

    MrSheepSheep Caporal

    130
    74
    28
    Le système de récupération de mots de passe est assez foireuse, difficile de le corriger sans tout réécrire.
     

Partager cette page

Chargement...