Page 1 sur 1

Mot de passe qui change tout seul dans la bdd

Posté : 11 mars 2014, 22:26
par Herodote
Bonjour à tous.
je suis confronté à un problème très embêtant. Lorsque mes membres modifient leur profil, de temps en temps, sans que je ne sache pourquoi, le mot de passe se modifie.
Il devient d41d8cd98f00b204e9800998ecf8427e . Après des recherches j'ai trouvé que cela correspondait à la chaine vide du md5. J'en ai conclu que mon erreur devait être que si le membre valide la modification de son profil sans mettre de mot de passe, cela envoie un mot de passe 'vide'. Seulement, malgré mes différents essais, je n'arrive pas à empêcher ce problème.
Voici mon code :
<?php
session_start();
$titre="Profil";
include("includes/identifiants.php");
include("includes/debut3.php");
include("includes/menu.php");
//On récupère la valeur de nos variables passées par URL
$action = (isset($_POST['action'])) ? $_POST['action'] : (isset($_GET['action']) ? $_GET['action'] : null);
$membre = isset($_GET['m'])?(int) $_GET['m']:'';
?>
Le début où j'récupère le membre et l'action.
 case "modifier":
    if (empty($_POST['sent'])) 
    { 
	$id=$_SESSION['id'];
        //On commence par s'assurer que le membre est connecté
        if ($id==0) erreur(ERR_IS_NO_CO);

        //On prend les infos du membre
        $query=$db->prepare('SELECT membre_pseudo, membre_email,
        membre_siteweb, membre_signature, membre_msn, membre_localisation,
        membre_avatar, membre_perso, lvl_perso
        FROM forum_membres WHERE membre_id=:id');
        $query->bindValue(':id',$id,PDO::PARAM_INT);
        $query->execute();
        $data=$query->fetch();
        echo '<p><i>Vous êtes ici</i> : <a href="./index.php">Index du forum</a> --> Modification du profil';
        echo '<h1>Modifier son profil</h1>';
        
        echo '<form method="post" action="voirprofil.php?action=modifier" enctype="multipart/form-data">
       
 
        <fieldset><legend>Identifiants</legend>
        Pseudo : <strong>'.stripslashes(htmlspecialchars($data['membre_pseudo'])).'</strong><br /> <br />      
        <label for="password"><strong>Nouveau mot de Passe :</strong></label>
        <input type="password" name="password" id="password" /><br /><br />
        <label for="confirm"><strong>Confirmer le mot de passe :</strong></label>
        <input type="password" name="confirm" id="confirm"  />
        </fieldset>

/// [...]

 echo'
        <p>Veuillez confirmer votre mot de passe avant de valider.<br /><br />
        <input type="submit" value="Modifier son profil" />
        <input type="hidden" id="sent" name="sent" value="1" /> 
        </p></form>';
}
 
Ensuite la vérification que le mot de passe existe (mon erreur est sûrement ici) :
  else //Sinon on est dans la page de traitement
    {
    $mdp_erreur = NULL;
    $i = 0;
     if ($_POST['password'] == $_POST['confirm']|| !empty($_POST['confirm']) || !empty($_POST['password']))
{
    $pass = md5($_POST['password']);
    $confirm = md5($_POST['confirm']);
}

if ($pass != $confirm || empty($confirm) || empty($pass))
    {
         $mdp_erreur = "Votre mot de passe et votre confirmation diffèrent ou sont vides";
         $i++;
    }
et enfin l'envoi du mot de passe :
if ($i == 0) // Si $i est vide, il n'y a pas d'erreur
    {
    if ($pass == $confirm && isset($confirm) || isset($pass))
    {
        $query=$db->prepare('UPDATE forum_membres
        SET  membre_mdp = :mdp, membre_email=:mail, membre_siteweb=:website,
        membre_signature=:sign, membre_localisation=:loc, membre_perso=:perso, lvl_perso=:lvl_perso
        WHERE membre_id=:id');
        $query->bindValue(':mdp',$pass,PDO::PARAM_STR);
        $query->bindValue(':mail',$email,PDO::PARAM_STR);
        $query->bindValue(':website',$website,PDO::PARAM_STR);
        $query->bindValue(':sign',$signature,PDO::PARAM_STR);
        $query->bindValue(':loc',$localisation,PDO::PARAM_STR);
        $query->bindValue(':id',$id,PDO::PARAM_INT);
		$query->bindValue(':perso',$perso,PDO::PARAM_INT); 
	    $query->bindValue(':lvl_perso',$lvl_perso,PDO::PARAM_INT);
        $query->execute();
        $query->CloseCursor();
	}
}
J'ai enlevé le reste des infos que les membres modifient sur leur profil. Mais si ça peut vous aider pour trouver mon erreur je le rajouterais.

En tout cas, merci d'avance si vous lisez ce post et que vous essayez de m'aider. :D

Re: Mot de passe qui change tout seul dans la bdd

Posté : 12 mars 2014, 06:37
par damien_55
Hello,

Dans ton switch case modifier, j'enlèverai le post du mot du mot de passe. Ce qui résoudra ton probleme. Comme l'utilisateur est connecté, ce n'est pas utile qu'il redefinisse son mot de passe lorsqu'il modifie les infos de base son profil.

Par ailleurs, je proposerai une page qui permet de redefinir seulement et uniquement le mot de passe. Bien entendu, tu verifies que le champ n'est pas vide à l'envoi afin qu'il y ait bien un mot de passe.

Re: Mot de passe qui change tout seul dans la bdd

Posté : 12 mars 2014, 10:59
par sirakawa
L'explication probable est que md5 de passe vide et md5 de co nfirm vide sont égaux.
Il est inutile de comparer les md5 quand on n'a pas d'information valable.
Voici un essai d traitement différencié, permettant de dire sur la page précédente :
Si vous voulez garder le même mot de passe laissez ces deux champs vides.

Il suffit d'exploiter la variable situation quand elle vaut 0 : changement de mot de passe ou 3 pas de changement, dans les autres cas, on renvoie un message d'erreur et on ignore le mot de passe, ou on renvoie à la saisie.

<?PHP 
$mdp_ok = true;
$erreur =0;
$situations = array(
0 =>"tout va bien",
1=> "mot de passe vide",
2 => "confirmation vide",
3 => "mot et confirm vides",
4 => "Mot de passe existe et confirm vide",
5 => "Mot de passe vide et confirm existe",
6 => "désaccord entre mot et confirm",
);


$passe = empty($_POST['password']) ? false:$_POST['password'];
$confirm = empty($_POST['confirm']) ? false: $_POST['confirm'];
if ($passe !== false)//____________________________________________________________mot de passe pas vide
{
	if ($confirm === false)//_________________________________mot de passe existe  et confirm vides
	{
		$situation = 4;
	}
	else//_____________________________________________mot de passe existe et confirm pas vide
	{
		if ($passe == $confirm)
		{	
			$situation = 0;
		}
		else
		{
			$situation = 6;
		}
	}
}
else//____________________________________________________________________________mot de passe vide
{
	if (empty($confirm))//__________________________________confirm vide
	{
		$situation =3;
	}
	else
	{
		$situation =5;
	}
}
$res = $situations  [$situation];
print "$passe $confirm $res";
?>

Re: Mot de passe qui change tout seul dans la bdd

Posté : 12 mars 2014, 13:47
par Herodote
Merci beaucoup !
Mon erreur était effectivement que si le membre ne remplissait aucune des cases, le mot de passe était envoyé vide.