Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara membuat fungsi reset kata sandi codeiginter saya aman?

Saya telah membaca kode Anda dan saya pikir meskipun saya menambahkan batas waktu untuk menggunakan token baru, itu masih belum aman. Menurut cheatsheat owasp tentang pemulihan sandi , Anda bisa melakukan lebih baik dari itu. Saya mempersingkatnya sedikit untuk Anda. Mereka menyebutkan lima poin.

  1. Gunakan beberapa data yang Anda kumpulkan dalam proses pendaftaran pengguna - bisa berupa tanggal lahir, nomor ponsel, nama keluarga, dll.
  2. Gunakan pertanyaan keamanan, dan masukkan input jawaban sebagai teks murni, jangan lakukan dropdown atau semacamnya. Batasi di sini jumlah tebakan. Jangan sepele dan inventif dalam menyusun pertanyaan-pertanyaan tersebut.
  3. Setelah langkah kedua, disarankan untuk segera mengunci akun pengguna. Buat token kata sandi terbatas waktu dan kirimkan (setidaknya coba) melalui saluran komunikasi yang berbeda, mungkin dengan sms, atau ke email sekunder.
  4. Awasi sesi, dan izinkan untuk menyetel ulang sandi hanya selama sesi saat ini. Terapkan kerumitan sandi pada langkah ini, (Anda dapat menggunakan beberapa plugin jquery untuk itu).
  5. Coba catat tindakan pengguna, alamat ip, data browser. Fokus pada upaya yang gagal atau menggunakan token yang kedaluwarsa. Dengan cara ini Anda dapat memantau perilaku jahat dan menarik beberapa kesimpulan.

Dan inilah sedikit peningkatan saya. Saya menggunakan kolom updated_at, yang dapat berguna dalam banyak situasi lain atau Anda dapat menentukan kolom Anda sendiri hanya untuk membatasi waktu menyetel ulang sandi.

<?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. Bagaimana saya bisa memasukkan data menggunakan bahasa non Inggris (Bangla) ke dalam tabel database ini?

  2. Bagaimana cara menghentikan mysqld

  3. Cara menulis kueri di MySQL untuk objek array JSON

  4. Pembaruan MySQL dengan variabel PHP dalam satu lingkaran

  5. Masalah waktu habis koneksi sumber data dasar (menggunakan mysql)