2017-09-14 4 views
1

Je veux demander comment changer le mot de passe pour l'utilisateur connecté, Je peux changer le mot de passe quand j'entre le mot de passe qui correspond à n'importe qui dans la base de données. Pour exemple, l'utilisateur a "admin" mot de passe, je viens d'entrer le mot de passe actuel, nouveau mot de passe et confirmer le mot de passe.Codeigniter: Changer le mot de passe pour l'utilisateur connecté et pour le mot de passe qui utilise md5

Mot de passe actuel: admin nouveau mot de passe: Mot de passe NewAdmin actuel: nouvelle administration

Et aussi je ne sais pas comment changer le mot de passe si le mot de passe utilise md5(). J'espère que vous pouvez m'aider, je suis un débutant sur Codeigniter. Je recherche des réponses, mais je ne comprends vraiment pas, donc je veux commenter, mais il est nécessaire 50 réputation donc je poster une nouvelle question.

Voici mon code:

Contrôleur

public function update(){ 
    $this->form_validation->set_rules('password', 'Current Password', 'required|alpha_numeric|min_length[6]|max_length[20]'); 
    $this->form_validation->set_rules('newpass', 'New Password', 'required|alpha_numeric|min_length[6]|max_length[20]'); 
    $this->form_validation->set_rules('confpassword', 'Confirm Password', 'required|alpha_numeric|min_length[6]|max_length[20]'); 

    if($this->form_validation->run()){ 
     $cur_password = $this->input->post('password'); 
     $new_password = $this->input->post('newpass'); 
     $conf_password = $this->input->post('confpassword'); 
     $this->load->model('queries'); 
     $userid = '1'; 
     $passwd = $this->queries->getCurrPassword($userid); 
     if($passwd->password == $cur_password){ 
      if($new_password == $conf_password){ 
       if($this->queries->updatePassword($new_password, $userid)){ 
        echo 'Password updated successfully'; 
       } 
       else{ 
        echo 'Failed to update password'; 
       } 
      } 
      else{ 
       echo 'New password & Confirm password is not matching'; 
      } 
     } 
     else{ 
      echo'Sorry! Current password is not matching'; 

    } 
} 
else{ 
    echo validation_errors(); 
} 

modèle

public function getCurrPassword($userid){ 
    $query = $this->db->where(['id'=>$userid]) 
        ->get('users'); 
    if($query->num_rows() > 0){ 
     return $query->row(); 
    } } 

    public function updatePassword($new_password, $userid){ 
    $data = array(
     'password'=> $new_password 
    ); 
     return $this->db->where('id', $userid) 
         ->update('users', $data); } 
+0

Vos données de mot de passe sont-elles stockées en tant que md5 dans votre db? – sintakonte

+0

@sintakonte Oui, c'est le cas. – squaredsquared

+0

Avec PHP, utilisez 'password_hash' et' password_verify'. Discussion: Lors de l'enregistrement d'un vérificateur de mot de passe, il suffit d'utiliser une fonction de hachage et il suffit d'ajouter un sel pour améliorer la sécurité. Au lieu de itérer sur un HMAC avec un sel aléatoire pour une durée d'environ 100ms et enregistrer le sel avec le hachage. Utilisez une fonction telle que PBKDF2, Rfc2898DeriveBytes, password_hash, Bcrypt, passlib.hash ou des fonctions similaires. Le but est que l'attaquant passe beaucoup de temps à trouver des mots de passe par force brute. – zaph

Répondre

0

J'ai trouvé une solution à mon problème.

Pour l'utilisateur connecté Je viens de changer le $ userid = '1'; en $ userid = $ this-> session-> userdata ('account_id');

Et pour le mot de passe md5 Je viens d'ajouter md5 sur passwords.Like ce que @sintakonte a fait et @zaph est exact. "N'utilisez que des algorithmes de hachage à mots de passe forts comme BCrypt, qui est utilisé dans les fonctions de hachage par mot de passe de PHP."

Référence: https://www.codeigniter.com/userguide3/general/security.html

Merci pour l'aide les gars!

-2

Je ne vais pas discuter du sujet md5, mais vous devriez éviter les faibles algorithmes parce qu'ils ne sont pas sûrs. Utilisez password_verify et password_hash à cette fin. (Mais comme je l'ai dit je ne suis pas un missionnaire)

vous devez organiser votre code un peu mieux - parce que c'est un gâchis;)

essayez ce qui suit - votre contrôleur

public function update() 
{ 
    $this->form_validation->set_rules('password', 'Current Password', 'required|alpha_numeric|min_length[6]|max_length[20]'); 
    $this->form_validation->set_rules('newpass', 'New Password', 'required|alpha_numeric|min_length[6]|max_length[20]'); 
    $this->form_validation->set_rules('confpassword', 'Confirm Password', 'required|alpha_numeric|min_length[6]|max_length[20]'); 

    if($this->form_validation->run()) 
    { 
     $cur_password = $this->input->post('password'); 
     $new_password = $this->input->post('newpass'); 
     $conf_password = $this->input->post('confpassword'); 
     $this->load->model('queries'); 
     $userid = '1'; 

     try 
     { 
      $objUser = $this->queries->getUser($userid); 
      if ($objUser->password != md5($cur_password)) throw new Exception('Sorry! Current password is not matching'); 
      if ($new_password != $conf_password) throw new Exception('New password & Confirm password is not matching'); 
      $this->queries->updatePassword($new_password, $userid); 
      echo 'Password updated successfully'; 

     } 
     catch (Exception $e) 
     { 
      echo $e->getMessage(); 
     } 
    } 
    else 
    { 
     echo validation_errors(); 
    } 
} 

et votre modèle

public function getUser($userid) 
{ 
    $query = $this->db->where(id,$userid])->get('users'); 
    if($query->num_rows() == 1) 
    { 
     return $query->row(); 
    } 
    throw new Exception("no user data found"); 
} 

public function updatePassword($new_password, $userid) 
{ 
    $data = array 
    (
     'password'=> md5($new_password) 
    ); 
    if (!$this->db->where('id', $userid)->update('users', $data)) 
    { 
     throw new Exception('Failed to update password'); 
    } 
} 

il n'y a pas besoin de nommer votre modèle foncti sur getCurrPassword s'il retourne en fait un objet utilisateur - donc je l'ai renommé.

+0

Ne pas aider le développeur à fournir une sécurité médiocre qui met les utilisateurs en danger. Ne serais-tu pas missionnaire et aiderais-tu quelqu'un à sauter d'un pont? Ou dans ce cas, aider à fournir une sécurité mauvaise à inexistante à potentiellement des milliers d'utilisateurs? Bien sûr, c'est un problème moral, prioriser le développeur ou tous les utilisateurs. Note: Cette réponse pourrait être consultée par des centaines de futurs développeurs. – zaph

+0

@sintakonte j'ai essayé les codes que vous avez fournis mais il affiche toujours "aucune donnée utilisateur trouvée" et il change le mot de passe de l'utilisateur connecté – squaredsquared

+0

@zaph - je n'ai rien fourni - en fait j'ai dit c'est une approche faible et shouldn ne serons pas du tout utilisés - mais je ne suis pas intéressé ici à en discuter parce que le sujet ici était totalement différent ... (et votre exemple de pont - si vous savez que la mort n'est pas une perte du tout - mais le sauteur ne le fait pas, et je veux prendre le risque d'en faire l'expérience - je suppose que je n'interférerais pas ...) – sintakonte