[RESOLU] Pb modification mot de pass

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Pb modification mot de pass

Re: Pb modification mot de pass

par jeanmaki » 25 sept. 2013, 11:35

Merci juliette !! j'ai en effet repris mon code et j'ai utiliser la poo pour à la fois changer le mot de pass et le reste des informations et ca marche

Re: Pb modification mot de pass

par juliette » 21 sept. 2013, 21:34

Bon bien je sais pas trop comment t'expliquer..
// generate Salt and Cached password
 $sSalt = $this->getRandCode();
 $sPass = sha1(md5($sPassword) . $sSalt);
regarde la variable $sSalt elle contient a ce moment la une certaine valeur Tu dois absolument obtenir la même valeur mais au moment ou tu fais la modif...
Si non ton espace membre utilise la poo, tu devrais t'inspirer du formulaire d'inscription pour créer ton formulaire de modif !

Re: Pb modification mot de pass

par juliette » 21 sept. 2013, 21:23

C'est quand même dommage de faire comme ca, dans le 2eme code de ton 1er post, tu as une classe avec une fonction: performLogin, tu pourrais facilement t'en inspirer pour créer une nouvelle fonction dédié a la modif des mdp..

Re: Pb modification mot de pass

par jeanmaki » 21 sept. 2013, 21:22

Je pense que j'y suis lorsque je m'inscris avec le formulaire d'inscription mais lorsque je veux modifier mon password avec formulaire de modification je n'y suis plus...
Regarde au début du script qui suit
ci-contre : la page php de l'inscription :
<?php

define('PROFILE_TIMEOUT', 5); // 5 mins

// Profiles class
class CProfiles {

    // constructor
    function CProfiles() {
    }

    // profile registration
    function registerProfile() {
        $sUsername = $GLOBALS['MySQL']->escape($_POST['username']);
        $sFirstname = $GLOBALS['MySQL']->escape($_POST['firstname']);
        $sLastname = $GLOBALS['MySQL']->escape($_POST['lastname']);
        $sEmail = $GLOBALS['MySQL']->escape($_POST['email']);
        $sPassword = $GLOBALS['MySQL']->escape($_POST['password']);

        if ($sUsername && $sEmail && $sPassword) {
            // check if already exist
            $aProfile = $GLOBALS['MySQL']->getRow("SELECT * FROM `cs_profiles` WHERE `email`='{$sEmail}'");
            if ($aProfile['id'] > 0) {
                $sErrors = '<h2>Another profile with same email already exist</h2>';
            } else {
                // generate Salt and Cached password
                $sSalt = $this->getRandCode();
                $sPass = sha1(md5($sPassword) . $sSalt);

                // add new member into database
                $sSQL = "
                    INSERT INTO `cs_profiles` SET 
                    `name` = '{$sUsername}',
                    `first_name` = '{$sFirstname}',
                    `last_name` = '{$sLastname}',
                    `email` = '{$sEmail}',
                    `password` = '{$sPass}',
                    `salt` = '{$sSalt}',
                    `status` = 'active',
                    `role` = '1',
					`about` = '{$sAbout}',
                    `date_reg` = NOW();
                ";
                $GLOBALS['MySQL']->res($sSQL);

                // autologin
                $GLOBALS['CLogin']->performLogin($sUsername, $sPassword);
            }
        }
    }

    // get random code (for salt)
    function getRandCode($iLen = 8) {
        $sRes = '';

        $sChars = "23456789abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ";
        for ($i = 0; $i < $iLen; $i++) {
            $z = rand(0, strlen($sChars) -1);
            $sRes .= $sChars[$z];
        }
        return $sRes;
    }

    // get profiles block
    function getProfilesBlock($iLim = 10, $bOnlineOnly = false) {
        $iPLimit = PROFILE_TIMEOUT;
        $sOnlineSQL = ($bOnlineOnly) ? 'AND (`date_nav` > SUBDATE(NOW(), INTERVAL ' . $iPLimit . ' MINUTE))' : '';
        $sSQL = "
            SELECT `cs_profiles`.*,
            if (`date_nav` > SUBDATE(NOW(), INTERVAL {$iPLimit} MINUTE ), 1, 0) AS `is_online`
            FROM `cs_profiles`
            WHERE `status` = 'active'
            {$sOnlineSQL}
            ORDER BY `date_reg` DESC
            LIMIT {$iLim} 
        ";
        $aProfiles = $GLOBALS['MySQL']->getAll($sSQL);

        $bCanChat = ($_SESSION['member_id'] && $_SESSION['member_status'] == 'active' && $_SESSION['member_role']);

        // create list of messages
        $sCode = '';
        foreach ($aProfiles as $i => $aProfile) {
            $sName = ($aProfile['first_name'] && $aProfile['last_name']) ? $aProfile['first_name'] . ' ' . $aProfile['last_name'] : $aProfile['name'];
            $sSName = (strlen($sName) > 32) ? mb_substr($sName, 0, 28) . '...' : $sName;
            $iPid = $aProfile['id'];
            $sAvatar = $this->getProfileAvatar($iPid);

            $sOnline = ($aProfile['is_online'] == 1) ? '<img alt="" src="images/online.png" class="status_img" />' : '';
            $sChat = ($bCanChat /*&& $aProfile['is_online'] == 1*/) ? '<img id="'.$iPid.'" alt="chat" src="images/chat.png" class="pchat" title="'.$sName.'" />' : '';
            $sCode .= '<div id="'.$iPid.'" title="'.$sName.'"><a href="profile.php?id='.$iPid.'"><img src="'.$sAvatar.'" alt="'.$sName.'"><p>'.$sSName.$sChat.'</p>'.$sOnline.'</a></div>';
        }

        $sClass = ($bOnlineOnly) ? 'profiles online_profiles' : 'profiles';
        return '<div class="'.$sClass.'">' . $sCode . '</div>';
    }

    // get profile info
    function getProfileInfo($i) {
        $sSQL = "
            SELECT * 
            FROM `cs_profiles`
            WHERE `id` = '{$i}'
        ";
        $aInfos = $GLOBALS['MySQL']->getAll($sSQL);
        return $aInfos[0];
    }

    // get role name
    function getRoleName($i) {
        $sRet = 'Ordinary member';
        switch ($i) {
            case 4:
                $sRet = 'Moderator';
                break;
            case 5:
                $sRet = 'Administrator';
                break;
        }
        return $sRet;
    }

    // get profile avatar block
    function getProfileAvatarBlock() {
        if ($_SESSION['member_id']) {
            $aInfo = $this->getProfileInfo((int)$_SESSION['member_id']);
            if (is_array($aInfo) && count($aInfo)) {
                $sName = ($aInfo['first_name'] && $aInfo['last_name']) ? $aInfo['first_name'] . ' ' . $aInfo['last_name'] : $aInfo['name'];

                $aKeys = array(
                    '{id}' => $aInfo['id'],
                    '{image}' => $this->getProfileAvatar($aInfo['id']),
                    '{name}' => $sName
                );
                return strtr(file_get_contents('templates/avatar.html'), $aKeys);
            }
        }
    }

    function getProfileAvatar($i) {
        $sPath = 'data/' . $i . '.jpg';
        return (file_exists($sPath)) ? $sPath : 'images/member.png';
    }

    // add avatar (upload image)
    function addAvatar() {
        $iPid = (int)$_SESSION['member_id'];
        if ($iPid) {
            $sFileTmpName = $_FILES['avatar']['tmp_name'];
            $sDstFilename = 'data/' . $iPid . '.jpg';

            if (file_exists($sFileTmpName) && filesize($sFileTmpName) > 0) {
                $aSize = getimagesize($sFileTmpName);
                if (! $aSize) {
                    @unlink($sFileTmpName);
                    return;
                }

                $bGDInstalled = extension_loaded('gd');

                // resize if GD is installed
                if (! $bGDInstalled)
                    return;

                $iWidth = $iHeight = 48; // width and height for avatar image
                define('IMAGE_TYPE_GIF', 1);
                define('IMAGE_TYPE_JPG', 2);
                define('IMAGE_TYPE_PNG', 3);

                $gdInfoArray = gd_info();
                switch($aSize[2]) {
                    case IMAGE_TYPE_GIF:
                        if (! $gdInfoArray['GIF Read Support'] || ! $gdInfoArray['GIF Create Support'])
                            return;
                        $vSrcImage = @imagecreatefromgif($sFileTmpName);
                        break;
                    case IMAGE_TYPE_JPG:
                        if (! $gdInfoArray['JPG Support'] && ! $gdInfoArray['JPEG Support'])
                            return;
                        $vSrcImage = @imagecreatefromjpeg($sFileTmpName);
                        break;
                    case IMAGE_TYPE_PNG:
                        if (! $gdInfoArray['PNG Support'])
                            return;
                        $vSrcImage = @imagecreatefrompng($sFileTmpName);
                        break;
                    default:
                        return;
                }
                if (! $vSrcImage)
                    return;

                // calculate destination rate and sizes
                $fSrcRate = (float)($aSize[0] / $aSize[1]);
                $fDstRate = (float)($iWidth / $iHeight);
                $fResizeRate = ($fSrcRate > $fDstRate) ? (float)($iWidth / $aSize[0]) : (float)($iHeight / $aSize[1]);
                $iDstWidth = (int)($fResizeRate * $aSize[0]);
                $iDstHeight = (int)($fResizeRate * $aSize[1]);

                if (function_exists('imagecreatetruecolor') && $aSize[2] != IMAGE_TYPE_GIF) {
                    // resize if need (if size is larger than needed)
                    if ($aSize[0] > $iWidth || $aSize[1] > $iHeight) {
                        $vDstImage = imagecreatetruecolor($iDstWidth, $iDstHeight);
                        $vConvRes = imagecopyresampled($vDstImage, $vSrcImage, 0, 0, 0, 0, $iDstWidth, $iDstHeight, $aSize[0], $aSize[1]);
                    } else {
                        $vDstImage = $vSrcImage;
                        $vConvRes = true;
                    }
                } else { // for old GD versions and for GIF images
                    if ($aSize[0] > $iWidth || $aSize[1] > $iHeight) {
                        $vDstImage = imagecreate( $iDstWidth, $iDstHeight );
                        $vConvRes = imagecopyresized($vDstImage, $vSrcImage, 0, 0, 0, 0, $iDstWidth, $iDstHeight, $aSize[0], $aSize[1]);
                    } else {
                        $vDstImage = $vSrcImage;
                        $vConvRes = true;
                    }
                }

                if (! $vConvRes)
                    return;

                $bRes = imagejpeg($vDstImage, $sDstFilename);

                // memory cleanup
                if ($vDstImage != $vSrcImage) {
                    imagedestroy($vSrcImage);
                    imagedestroy($vDstImage);
                } else {
                    imagedestroy($vSrcImage);
                }
                return ($bRes && file_exists($sDstFilename)) ? 1 : '';
            }
        }
    }

    function changeColor($sColor = '') {
        $iPid = (int)$_SESSION['member_id'];
        $sColor = $GLOBALS['MySQL']->escape($sColor);
        if ($iPid && $sColor) {
            if (strlen($sColor) == 4) {
                $sColor = '00' . $sColor;
            }
            $sSQL = "
                UPDATE `cs_profiles` SET 
                `color` = '{$sColor}'
                WHERE `id` = '{$iPid}'
            ";
            $GLOBALS['MySQL']->res($sSQL);
            return 1;
        }
        return;
    }
}

$GLOBALS['CProfiles'] = new CProfiles();

Re: Pb modification mot de pass

par juliette » 21 sept. 2013, 21:10

ok, explique moi le comportement...
Est-tu sur du contenu de ces 2 variables: $sPassword et $sSalt au moment ou tu les utilise ?

Re: Pb modification mot de pass

par jeanmaki » 21 sept. 2013, 21:03

ok, j'ai rajouté $_POST['password'] = sha1(md5($sPassword) . $sSalt);
Du coup je me retrouve avec un mot de pass chiffré dans la bdd mais je ne peux toujours pas me connecter...
if(isset($_SESSION['name']) && isset($_SESSION['password'])){
$affichepassword = mysql_query("SELECT * FROM `cs_profiles` WHERE `name`='".($_SESSION['name'])."' AND `password`='".($_SESSION['password'])."'");

$resultpassword = mysql_fetch_assoc($affichepassword);
extract($resultpassword);
}

$_POST['password'] = sha1(md5($sPassword) . $sSalt);

if(isset($_POST['Envoyerpassword'])){
        //si pseudo vide
        if(empty($_POST['password'])){
            echo '<div class="erreur">Veuillez saisir un password!</div>';
        }
		//c'est ok
        else {
            //On sélectionne les données
				
				$donneespassword = mysql_query("SELECT password FROM `cs_profiles` WHERE `password`!='{$sPass}'") 
			
		or die ('Erreur :'.mysql_error());
 
            while($resultpassword = mysql_fetch_array($donneespassword)){
                //on vérifie si le pseudo est utilisé
               
			   if(($_POST['password'])== $resultpassword['password']){
                    echo '<div class="erreur">Ce password est utilisé!</div>'; return false;
                } 					
				
            }
			 //si c'est ok
 
            //on modifie les données du membre
            $modifpassword = mysql_query("UPDATE `cs_profiles` SET `password`='".($_POST['password'])."'
			WHERE `status`='active'");
			
			//Si il y a une erreur
            if (!$modifpassword) {
                die('Requête invalide : ' . mysql_error());
            }
			//tout est ok
            else{
                //on informe le membre
				

                echo '<div class="ok">Modification password enregistrées avec succès avec succès! Vous allez être déconnecté du service pour ouvrir une nouvelle session.</div>';
                
				echo '<script type="text/javascript"> window.setTimeout("location=(\'index.php?dec=close&session=new\');",3000) </script>';
            }
        }
    }



Re: Pb modification mot de pass

par juliette » 21 sept. 2013, 20:53

Oui, je viens de te l'expliquer, regarde bien ton code, regarde la procédure a partir de ce moment la:
//on modifie les données du membre
EDIT: Et c'est normale que tu ne puisse plus te connecter car php compare un mdp(aché venant du formulaire de connexion) avec un mdp(non-aché enregistré en bdd)

Re: Pb modification mot de pass

par jeanmaki » 21 sept. 2013, 20:48

salut, lors de mon inscription dans l'espace membre le sha1(md5($password) . s$salt) fonctionne puisque j'ai un mot de pass chiffré et un code salt aléatoire dans mysql... C'est lorsque je veux modifier mon mot de pass après mon inscription que le password est affiché en clair dans mysql et c'est après cette modification que je ne peux plus me connecter...

Re: Pb modification mot de pass

par juliette » 21 sept. 2013, 20:29

Salut,
si le nouveau mdp est enregistré en claire c'est que la fonction sha1(md5($password) . s$salt) n'est pas présente au moment de la mise a jour du mdp...

Pb modification mot de pass

par jeanmaki » 21 sept. 2013, 18:45

Bonjour, j'ai un petit soucis au niveau de la modification de mot de pass d'un espace membre que j'essaie de créer, en effet lors de l'enregistrement du membre, le mot de pass choisi est chiffré de la forme sha1(md5($password) . s$salt)

Voici la page de modification :
if(isset($_SESSION['name']) && isset($_SESSION['password'])){
$affichepassword = mysql_query("SELECT * FROM `cs_profiles` WHERE `name`='".($_SESSION['name'])."' AND `password`='".($_SESSION['password'])."'");

$resultpassword = mysql_fetch_assoc($affichepassword);
extract($resultpassword);
}

if(isset($_POST['Envoyerpassword'])){
        //si pseudo vide
        if(empty($_POST['password'])){
            echo '<div class="erreur">Veuillez saisir un password!</div>';
        }
		//c'est ok
        else {
            //On sélectionne les données
				
				$donneespassword = mysql_query("SELECT password FROM `cs_profiles` WHERE `password`!='{$sPass}'") 
			
		or die ('Erreur :'.mysql_error());
 
            while($resultpassword = mysql_fetch_array($donneespassword)){
                //on vérifie si le pseudo est utilisé
               
			   if(($_POST['password'])== $resultpassword['password']){
                    echo '<div class="erreur">Ce password est utilisé!</div>'; return false;
                } 					
				
            }
			 //si c'est ok
 
            //on modifie les données du membre
            $modifpassword = mysql_query("UPDATE `cs_profiles` SET `password`='".($_POST['password'])."'
			WHERE `status`='active'");
			
			//Si il y a une erreur
            if (!$modifpassword) {
                die('Requête invalide : ' . mysql_error());
            }
			//tout est ok
            else{
                //on informe le membre
				

                echo '<div class="ok">Modification password enregistrées avec succès avec succès! Vous allez être déconnecté du service pour ouvrir une nouvelle session.</div>';
                
				echo '<script type="text/javascript"> window.setTimeout("location=(\'index.php?dec=close&session=new\');",3000) </script>';
            }
        }
    }
Avec ce formulaire, j'arrive à modifier le password, mais celui-ci apparait en toutes lettres dans mysql et lorsque je me déconnecte et me reconnecte avec le nouveau password, et bien je n'arrive plus à accéder à mon espace avec comme message "password or username is incorect"

voici la page de login :
<?php

class CLogin {

    // constructor
    function CLogin() {
        session_start();
    }

    // get login box function
    function getLoginBox() {
        if (isset($_GET['logout'])) { // logout processing
            if (isset($_SESSION['member_name']) && isset($_SESSION['member_pass']))
                $this->performLogout();
        }

        if ($_POST && $_POST['Login'] == 'Login' && $_POST['username'] && $_POST['password']) { // login processing
            if ($this->checkLogin($_POST['username'], $_POST['password'], false)) { // successful login
                $this->performLogin($_POST['username'], $_POST['password']);
                header( "Location:{$_SERVER['REQUEST_URI']}" );
                exit;
            } else { // wrong login
                return file_get_contents('templates/login_form.html') . '<h2>Username or Password is incorrect</h2>';
            }
        } else { // in case if we already logged (on refresh page):
            if (isset($_SESSION['member_name']) && $_SESSION['member_name'] && $_SESSION['member_pass']) {
                $aReplaces = array(
                    '{name}' => $_SESSION['member_name'],
                    '{status}' => $_SESSION['member_status'],
                    '{role}' => $_SESSION['member_role'],
                );
                return strtr(file_get_contents('templates/logout_form.html'), $aReplaces);
            }

            // otherwise - draw login form
            return file_get_contents('templates/login_form.html');
        }
    }

    // perform login
    function performLogin($sName, $sPass) {
        $this->performLogout();

        // make variables safe
        $sName = $GLOBALS['MySQL']->escape($sName);

        $aProfile = $GLOBALS['MySQL']->getRow("SELECT * FROM `cs_profiles` WHERE `name`='{$sName}'");
        // $sPassEn = $aProfile['password'];
        $iPid = $aProfile['id'];
        $sSalt = $aProfile['salt'];
        $sStatus = $aProfile['status'];
        $sRole = $aProfile['role'];

        $sPass = sha1(md5($sPass) . $sSalt);

        $_SESSION['member_id'] = $iPid;
        $_SESSION['member_name'] = $sName;
        $_SESSION['member_pass'] = $sPass;
        $_SESSION['member_status'] = $sStatus;
        $_SESSION['member_role'] = $sRole;
    }

    // perform logout
    function performLogout() { 
        unset($_SESSION['member_id']);
        unset($_SESSION['member_name']);
        unset($_SESSION['member_pass']);
        unset($_SESSION['member_status']);
        unset($_SESSION['member_role']);
    }

    // check login
    function checkLogin($sName, $sPass, $isHash = true) {
        // make variables safe
        $sName = $GLOBALS['MySQL']->escape($sName);
        $sPass = $GLOBALS['MySQL']->escape($sPass);

        $aProfile = $GLOBALS['MySQL']->getRow("SELECT * FROM `cs_profiles` WHERE `name`='{$sName}'");
        $sPassEn = $aProfile['password'];

        if ($sName && $sPass && $sPassEn) {
            if (! $isHash) {
                $sSalt = $aProfile['salt'];
                $sPass = sha1(md5($sPass) . $sSalt);
            }
            return ($sPass == $sPassEn);
        }
        return false;
    }
}

$GLOBALS['CLogin'] = new CLogin();

Merci de m'éclairer