2017-09-14 11 views
1

ログインしたユーザーのパスワードの変更方法を教えてください データベース内のすべてのユーザーと一致するパスワードを入力するとパスワードを変更できます。 例として、ユーザーには「admin」パスワードがあります。現在のパスワード、 新しいパスワードとパスワードを確認するだけです。Codeigniter:ログインしたユーザーのパスワードとmd5を使用するパスワードの変更

現在のパスワード:管理者 新しいパスワード:newadmin 現在のパスワード:新しい管理

とパスワード はMD5を使用している場合にも、私はパスワードを変更する方法がわかりません()。あなたが私を助けてくれることを願っています。私はCodeigniterの初心者です。 私は答えを検索しますが、私は本当にそれを理解していないので、私はコメントしたいですが、 それは50の評判が必要ですので、私は新しい質問を投稿します。ここで

は私のコードです:

コントローラ

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(); 
} 

モデル

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

は、データベースにmd5として保存されたパスワードデータですか? – sintakonte

+0

@sintakonteはい、そうです。 – squaredsquared

+0

PHPでは 'password_hash'と' password_verify'を使います。解説:ハッシュ関数を使用するだけでパスワードベリファイアを保存するだけでは不十分で、単に塩を追加するだけでセキュリティを向上させることはほとんどありません。代わりに、約100msの間、ランダムな塩でHMACを繰り返し、塩をハッシュで保存します。 PBKDF2、Rfc2898DeriveBytes、password_hash、Bcrypt、passlib.hashなどの関数を使用してください。要点は、攻撃者が無差別にパスワードを見つけるのにかなりの時間を費やすようにすることです。 – zaph

答えて

0

私は私の問題の解決策を得ました。

ログインユーザー私はちょうど$ userid = '1'を変更しました。 $ userid = $ this-> session-> userdata( 'account_id');には、 に入ります。

そして、私はちょうどやった@sintakonte passwords.LikeにMD5を追加し、@zaphが正しいとMD5パスワード ため。

"PHP独自のパスワードハッシュ関数で使用されているBCryptのような強力なパスワードハッシングアルゴリズムのみを使用してください。

参考:ヘルプみんなのためhttps://www.codeigniter.com/userguide3/general/security.html

ありがとう!

-2

私はここにMD5の件名を議論するつもりはないが、あなたは、弱いものは避けるべきアルゴリズムは安全ではないためです。この目的のためにpassword_verifypassword_hashを使用してください。これは混乱であるので - あなたのコードビットよりよく整理する必要がある

(しかし、私は宣教師ないよ言ったように);

は、次のことを試してください) - あなたのコントローラ

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(); 
    } 
} 

とあなたのモデル

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'); 
    } 
} 

モデルに名前を付ける必要はありませんfuncti実際にユーザーオブジェクトを返す場合はgetCurrPasswordにあります。そのため、私はその名前を変更しました。

+0

開発者がユーザーの危険にさらされるようなセキュリティを守らないと助けてください。あなたも宣教師ではなく、誰かが橋を脱ぐのを助けるでしょうか?または、この場合、潜在的に何千ものユーザーに存在しないセキュリティに悪影響を与えるのを助けますか?確かに、これは道徳的な問題であり、開発者またはすべてのユーザーに優先順位を付けます。注:この回答は、何百人もの将来の開発者が参考になるかもしれません。 – zaph

+0

@sintakonteあなたが提供したコードを試しましたが、常に「ユーザーデータが見つかりません」と表示され、logged_inユーザーのパスワードが変更されています – squaredsquared

+0

@zaph - 私は何も提供していませんでした - これは弱いアプローチだと言いますまったく使用されていませんが、私はここで話題には興味がありません。なぜなら、ここでの話題は全く違っていたからです(そして、あなたの橋の例から飛び降りて - しかし、ジャンパーは、それを経験する危険を冒すことを望んでいる - 私は干渉しないだろうと思う...) – sintakonte

関連する問題