Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да направя моята функция за нулиране на парола на codeiginter защитена?

Прочетох вашия код и мисля, че дори и да добавя времево ограничение за използване на нов токен, пак не е сигурно. Според owasp cheatsheat за възстановяване на парола , можеш и по-добре от това. Съкращавам го малко за вас. Назовават пет точки.

  1. Използвайте някои данни, които сте събрали в процеса на регистрация на потребител - това може да бъде рождена дата, номер на мобилен телефон, фамилия и др.
  2. Използвайте защитни въпроси и поставяйте въведените отговори като чист текст, не правете падащо меню или нещо подобно. Ограничете тук броя на предположенията. Бъдете нетривиални и изобретателни при конструирането на тези въпроси.
  3. След втора стъпка се препоръчва незабавно да заключите потребителския акаунт. Генерирайте ограничен във времето токен за парола и го изпратете (поне опитайте) през различен комуникационен канал, може би с sms или до вторичен имейл.
  4. Наблюдавайте сесията и позволявайте повторно задаване на парола само по време на текущата сесия. Приложете сложността на паролата в тази стъпка (можете да използвате някакъв плъгин jquery за това).
  5. Опитайте се да регистрирате потребителски действия, IP адрес, данни на браузъра. Съсредоточете се върху неуспешни опити или използване на изтекли токени. По този начин можете да наблюдавате злонамереното поведение и да направите някои заключения.

И ето моето малко подобрение. Използвам колона updated_at, която може да бъде полезна в много други ситуации или можете да посочите своя собствена колона само за ограничаване на времето за повторно задаване на парола.

<?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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. TIMESTAMPDIFF() Примери – MySQL

  2. Добре ли е да използвате htmlspecialchars() преди вмъкване в MySQL?

  3. MySQL Atomic UPDATE в InnoDB срещу MyISAM

  4. Вземете масив от MySQL към android

  5. jenkins се проваля при рестартиране на моя sql sudo:не присъства tty и не е посочена програма askpass Съжаляваме, опитайте отново.