Je m’explique, pour une application, je propose au utilisateurs de modifié leurs informations (Pour le moment E-Mail et mot de passe) donc pour une bonne sécurité, je leur demande leur mot de passe actuel pour vérifié qu'ils sont bien titulaires du compte (Un peu à la twitter), sauf que quand je fait la requête en BDD, Cake me retourne le mot de passe en mode * (On peut le voir avec un debug). C'est possible de récupérer le mot de passe en clair (3faca9d9f59...) ?

Merci d'avance de vos réponses, cordialement, Matspyder

6 réponses


Lartak
Réponse acceptée

Bonjour.
C'est normal que tu aies des erreurs, vu que ta variable $confirm est un tableau et tu la compare avec une valeur.
Tu dois commencer par modifier

$confirm == $this->request->data'User']'confirm']

par

$confirm'User']'password'] == $this->request->data'User']'confirm']

Si tu ne veux récupérer qu'un seul champ dans ton find, il te ne te faut spécifier que password dans la clé fields et non l'ID en plus, par exemple :

$confirm = $this->User->find('first', array('conditions' => array('User.id' => $this->Auth->user('id')), 'fields' => array('User.password')));

Bonjour,
tu ne le vois pas dans le débug mais tu dois pouvoir faire un test dessus dans le code.

On ne le vois pas dans le débug car le débug utilisé le cache exprès:

protected static function _array(array $var, $depth, $indent) {
$secrets = array(
'password' => '*****',
'login' => '*****',
'host' => '*****',
'database' => '*****',
'port' => '*****',
'prefix' => '*****',
'schema' => '*****'
);
...

J'ai quand même tester comme tu peut voir :

public function edit(){
    if($this->request->is('post')){
        $confirm = $this->User->find('first',array('conditions'=>array('User.id'=>$this->Auth->user('id')),'fields'=>array('User.id','User.password')));
        die(debug($confirm));
        $passwordHasher = new SimplePasswordHasher();
        $this->request->data'User']'confirm'] = $passwordHasher->hash(
            $this->request->data'User']'confirm']);
        if($confirm==$this->request->data'User']'confirm']){
            if(!empty($this->request->data'User']'password'])){
                if($this->request->data'User']'password']!=$this->request->data'User']'passwordConfirm']){
                    $this->Session->setFlash('Vos mots de passe ne correspondent pas !','alert',array('class'=>'error'));
                }else{
                    $this->User->id=$this->Auth->user('id');
                    $this->User->save(h($this->request->data));
                    $this->Session->setFlash('Informations modifiées','alert',array('class'=>'success'));
                    $this->redirect(array('action'=>'profil','id'=>$this->Auth->user('id')));
                }
            }else{
                $this->User->id=$this->Auth->user('id');
                $this->User->save(h($this->request->data));
                $this->Session->setFlash('Informations modifiées','alert',array('class'=>'success'));
                $this->redirect(array('action'=>'profil','id'=>$this->Auth->user('id')));
            }
        }else{
            $this->Session->setFlash('Les informations n\'ont pas été modifié, Le mot de passe pour la confirmation de modification n\'est pas valide','alert',array('class'=>'error'));
        }
    }
    $user=$this->User->find('first',array('conditions'=>array('User.id'=>$this->Auth->user('id'))));
    $this->set('user',$user);
}

Oui la fonction est compliqué car je fait d'autres tests ... Enfin, j'ai beau essayer, il me retourne toujours : Les informations n\'ont pas été modifié, Le mot de passe pour la confirmation de modification n\'est pas valide

ne JAMAIS !!!!!! stocker des mots de passe dans la base de données en clair. GROSSE ERREUR DE SECURITE !!!!

Si tu veux modifier un mot de passe, tu dois l'encoder avant l'enregistrement.
Si tu as un champ "mot de passe actuel" pour t'assurer que c'est bien l'utilisateur, du dois l'encrypter avant la comparaison.

Si tu veux proposer un lien "mot de passe perdu", tu dois lui permettre d'en écrire un nouveau et non pas lui redonner l'actuel.

Une fois que le mot de passe est encrypté, il est impossible de récupérer le mot de passe en clair (sinon la fonction d'encryption n'aurait aucun intérêt). Par contre, à moins que tu ne changes le type d'encryption et la clé de salage, un mot de passe clair donnera toujours le même mot de passe encrypé. C'est le seul moyen pour pouvoir faire une comparaison de mots de passe.

J'espère que c'est clair ! :D

@prbaron : Pour le fait de ne pas stocker en clair, je suis au courant, je voulais dire récupérer le hash dans un tableau sans qu'il soit remplacer oar des "******".

@lartak11 : Merci bien, c'est vrai que c'est une erreur d’inattention que j'aurait du pouvoir résoudre moi même.