6

こんにちは: ログイン ページに忘れたパスワードを実装する必要があります。ここで、これまでの内容を説明しました。

  1. ビューを回復すると、受信した電子メールの入力が促されます
  2. 関数email_exists()は電子メールを確認します。その場合、send_email()キー$temp_passとリンクを使用します。データベースは、さらなるアクションと検証のために $temp_pass を保存します。
  3. ユーザーは、以前に送信されたリンクをクリックして、$temp_passreset_password 関数に渡します。
  4. モデル コントローラは$temp_passデータベースで検証します。もしそうなら、新しいパスワードを入力するためにビューをロードしてください - そして、ここでフォームが認識しないコントローラを指しているため、$temp_passパスワードをリセットすることができません。

正しいユーザーに関連付けられた新しいパスワードを取得してパスワードをリセットするにはどうすればよいですか?

以下のコード:

コントローラ

    public function recover(){
    //Loads the view for the recover password process.
    $this->load->view('recover');
}
public function recover_password(){
    $this->load->library('form_validation');
    $this->form_validation->set_rules('email', 'Email', 'required|trim|xss_clean|callback_validate_credentials');

            //check if email is in the database
        $this->load->model('model_users');
        if($this->model_users->email_exists()){
            //$them_pass is the varible to be sent to the user's email 
            $temp_pass = md5(uniqid());
            //send email with #temp_pass as a link
            $this->load->library('email', array('mailtype'=>'html'));
            $this->email->from('user@yahoo.com', "Site");
            $this->email->to($this->input->post('email'));
            $this->email->subject("Reset your Password");

            $message = "<p>This email has been sent as a request to reset our password</p>";
            $message .= "<p><a href='".base_url()."main/reset_password/$temp_pass'>Click here </a>if you want to reset your password,
                        if not, then ignore</p>";
            $this->email->message($message);

            if($this->email->send()){
                $this->load->model('model_users');
                if($this->model_users->temp_reset_password($temp_pass)){
                    echo "check your email for instructions, thank you";
                }
            }
            else{
                echo "email was not sent, please contact your administrator";
            }

        }else{
            echo "your email is not in our database";
        }
}
public function reset_password($temp_pass){
    $this->load->model('model_users');
    if($this->model_users->is_temp_pass_valid($temp_pass)){

        $this->load->view('reset_password');

    }else{
        echo "the key is not valid";    
    }

}
public function update_password(){
    $this->load->library('form_validation');
        $this->form_validation->set_rules('password', 'Password', 'required|trim');
        $this->form_validation->set_rules('cpassword', 'Confirm Password', 'required|trim|matches[password]');
            if($this->form_validation->run()){
            echo "passwords match"; 
            }else{
            echo "passwords do not match";  
            }
}

モデル_ユーザー

    public function email_exists(){
    $email = $this->input->post('email');
    $query = $this->db->query("SELECT email, password FROM users WHERE email='$email'");    
    if($row = $query->row()){
        return TRUE;
    }else{
        return FALSE;
    }
 }
public function temp_reset_password($temp_pass){
    $data =array(
                'email' =>$this->input->post('email'),
                'reset_pass'=>$temp_pass);
                $email = $data['email'];

    if($data){
        $this->db->where('email', $email);
        $this->db->update('users', $data);  
        return TRUE;
    }else{
        return FALSE;
    }

}
public function is_temp_pass_valid($temp_pass){
    $this->db->where('reset_pass', $temp_pass);
    $query = $this->db->get('users');
    if($query->num_rows() == 1){
        return TRUE;
    }
    else return FALSE;
}
4

2 に答える 2

0

パスワードのリセット手順を改善することを提案したいと思います。

  1. ユーザーモデルとは別にリセット情報を独自のデータベーステーブルに保存すると、有効期限、ユーザーID、使用済みフラグなどの他の情報をトークンとともに保存できます。ユーザー モデルはクリーンなままで、複数のリセットが互いに干渉することはありません。
  2. リセット トークンはデータベースに直接保存しないでください。代わりに、トークンのハッシュのみを保存する必要があります。データベースへの読み取りアクセス (SQL インジェクション) を持つ攻撃者は、それ以外の場合、任意のアカウントをリセットできます。
  3. トークンは予測不可能である必要がありmd5(uniqid())、リセットが行われた時間がわかっている場合は、ひどく絞り込むことができます。

安全なトークンを生成できるクラスと一緒に、そのようなパスワードリセット手順がどのように見えるか、いくつかのサンプルコードを公開しました。

于 2015-03-04T09:21:48.293 に答える
0

どこで立ち往生しているのかよくわかりません。ユーザーがリンクをクリックしたときに確認する、ユーザー用の一時的なフラグを作成しているという事実を得ることができます。つまり、その時点でセッションを開始でき、ユーザーはその特定のセッションがアクティブな場合にのみパスワードをリセットできます。

このステップの後、ユーザーに新しいパスワードを入力するように求めます。ユーザーに対して呼び出す一時フラグがある$temp_passため (一意である必要があることに注意してください)、リセットしようとしているユーザーを取得できます。パスワード。

したがって、必要なことは、この種の db クエリを実行することだけです -

$this->db->where('reset_pass', $temp_pass);
$this->db->update('users', $data); // where $data will have the fields with values you are updating

私はあなたが間違いを犯したと思います

また、私はあなたのrecover_password()機能に気づきました-

$message .= "<p><a href='".base_url()."main/reset_password/$temp_pass'>Click here </a>if you want to reset your password, if not, then ignore</p>";

上記の行は-

$message .= "<p><a href='".base_url()."main/reset_password/".$temp_pass."'>Click here </a>if you want to reset your password, if not, then ignore</p>";

アップデート

セッションに渡し$temp_passて、そこから取得できます。それはそれについて行く1つの方法です。

于 2013-01-06T08:41:31.557 に答える