sql >> Databáze >  >> RDS >> Mysql

Jak zabezpečit funkci resetování hesla codeiginter?

Přečetl jsem si váš kód a myslím, že i když přidám časový limit pro použití nového tokenu, stále není bezpečný. Podle wasp cheatsheat na obnovení hesla , můžete to udělat lépe. Trochu ti to zkrátím. Jmenují pět bodů.

  1. Použijte některá data, která jste shromáždili v procesu registrace uživatele – mohou to být datum narození, číslo mobilního telefonu, příjmení atd.
  2. Používejte bezpečnostní otázky a vstupy odpovědí vkládejte jako čistý text. Neprovádějte rozevírací seznam ani nic podobného. Zde omezte počet tipů. Při vytváření těchto otázek buďte netriviální a vynalézaví.
  3. Po druhém kroku se doporučuje zamknout uživatelský účet. Vygenerujte si časově omezený token hesla a odešlete jej (alespoň se o to pokuste) jiným komunikačním kanálem, třeba sms nebo na sekundární e-mail.
  4. Sledujte relaci a povolte resetování hesla pouze během aktuální relace. V tomto kroku vynutit složitost hesla (k tomu můžete použít nějaký plugin jquery).
  5. Zkuste zaznamenat akce uživatele, IP adresu, data prohlížeče. Zaměřte se na neúspěšné pokusy nebo použití tokenů s prošlou platností. Tímto způsobem můžete sledovat škodlivé chování a vyvozovat nějaké závěry.

A tady je můj malý upgrade. Používám sloupec updated_at, který může být užitečný v mnoha jiných situacích, nebo můžete zadat svůj vlastní sloupec pouze pro omezení doby resetování hesla.

<?php

public function recover(){
    $data['main_content'] = 'auth/recover';
    $this->load->view('public/layouts/home_main', $data);
}

public function recover_account(){
    $this->form_validation->set_rules('username','Username','trim|xss_clean|required');
    if ($this->form_validation->run() == FALSE){
        //Show View
        $data = array(
            'errors' => validation_errors()
        );
        $this->session->set_flashdata($data);
        $data['main_content'] = 'auth/recover';
        $this->load->view('public/layouts/home_main', $data);
    }
    else{
        $account = $this->input->post('username');
        if($this->User_model->user_exist($account)){
            $options = [
                'cost' => 8,
                'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM),
            ];
            $temp_pass = password_hash(rand(23456,975655), PASSWORD_BCRYPT, $options);
            $reset_code = rand(23456,975655);
            $data = array(
                'reset_link_code' => $reset_code
            );
            $this->session->set_userdata($data);

            $this->email->from('[email protected]', 'Your Name');
            $this->email->to('[email protected]');
            $this->email->subject($reset_code);
            $this->email->message(
                'Testing the email class.'.' pass: <a href="'.base_url().'auth/reset_password?user='.urlencode($account).'&code='.urlencode($temp_pass).'&rstc='.urlencode($reset_code).'">Click Here</a>'
            );
            $db_pass = array(
                'password' => $temp_pass,
                'updated_at' => time() //or even date("Y-m-d H:i:s")
            );
            $this->db->where('email', $account);
            $this->db->or_where('username', $account);
            $this->db->update('users', $db_pass);

            if($this->email->send()){
                echo 'Passowrd resend link sent to email';
            }else{
                echo 'email count not check, pls talk to support';
            }
        }else{
            echo "User not Fount";
        }
    }
}
function reset_password(){
    $email = urldecode($this->input->get('user', true));
    $temp_pass = urldecode($this->input->get('code', true));
    $reset_code = urldecode($this->input->get('rstc', true));

    if($email && $temp_pass && $reset_code){

        $this->form_validation->set_rules('user','Username','trim|xss_clean|min_length[4]');
        $this->form_validation->set_rules('newpass','Password','trim|xss_clean|required|min_length[4]|max_length[50]');
        $this->form_validation->set_rules('newpass2','Confirm Password','trim|xss_clean|required|matches[newpass]');

        if($reset_code == $this->session->userdata('reset_link_code')){
            //get user data by email
            //$user = $this->User_model->get_heshed_password($email);
            $user = $this->User_model->get_heshed_password_and_updated_value($email);

            //calculate time difference
            $dbdate = strtotime($user->updated_at);
            if (time() - $dbdate > 15 * 60) {
                // 15 mins has passed
                $time_allowed = false;
            } else {
                $time_allowed = true;
            }

            if($temp_pass == $user->password && $time_allowed){
                if ($this->form_validation->run() == FALSE){
                    //Show View
                    $data = array(
                        'errors' => validation_errors()
                    );
                    $this->session->set_flashdata($data);
                    $data['main_content'] = 'auth/reset_password';
                    $this->load->view('public/layouts/home_main', $data);
                }
                else{
                    $options = [
                        'cost' => 8,
                        'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM),
                    ];
                    $password = $this->input->post('newpass');
                    $passtodb = password_hash($password, PASSWORD_BCRYPT, $options);
                    $data = array(
                        'password' => $passtodb
                    );
                    $this->db->where('email', $email);
                    $this->db->or_where('username', $email);
                    $this->db->update('users', $data);
                    redirect('account');
                }

            }
        }else{
            echo 'invalid reset code';
        }

    }else{
        redirect('/');
    }
}



  1. Jak změnit formát data a času v MySQL

  2. Měly by být primární klíče vždy přidány do tabulky innodb?

  3. InnoDB:Hromadné vložení pomocí transakce NEBO zkombinovat více dotazů?

  4. Jak odstranit úvodní nuly z dat v Oracle