मैंने आपका कोड पढ़ लिया है और मुझे लगता है कि अगर मैं नए टोकन का उपयोग करने के लिए समय सीमा जोड़ दूं तो भी यह सुरक्षित नहीं है। ओवास्प चीटशीट ऑन पासवर्ड रिकवरी के अनुसार , आप उससे बेहतर कर सकते हैं। मैं इसे आपके लिए थोड़ा छोटा करता हूं। वे पाँच बिंदुओं को नाम देते हैं।
- उपयोगकर्ता पंजीकरण प्रक्रिया में आपके द्वारा एकत्र किए गए कुछ डेटा का उपयोग करें - यह जन्मदिन, मोबाइल फोन नंबर, उपनाम आदि हो सकता है।
- सुरक्षा प्रश्नों का उपयोग करें, और उत्तर इनपुट को शुद्ध पाठ के रूप में रखें, ड्रॉपडाउन या ऐसा कुछ भी न करें। यहां अनुमानों की संख्या सीमित करें। उन प्रश्नों के निर्माण में गैर तुच्छ और आविष्कारशील बनें।
- चरण दो के बाद, उपयोगकर्ता खाते को समान रूप से लॉक करने की अनुशंसा की जाती है। समय सीमित पासवर्ड टोकन उत्पन्न करें और इसे विभिन्न संचार चैनलों के माध्यम से भेजें (कम से कम कोशिश करें), शायद एसएमएस के साथ, या द्वितीयक ईमेल पर।
- सत्र पर नजर रखें, और केवल वर्तमान सत्र के दौरान ही पासवर्ड रीसेट करने की अनुमति दें। इस चरण में पासवर्ड की जटिलता को लागू करें, (आप उसके लिए कुछ jQuery प्लगइन का उपयोग कर सकते हैं)।
- उपयोगकर्ता क्रियाओं, आईपी पते, ब्राउज़र डेटा को लॉग करने का प्रयास करें। असफल प्रयासों या समय सीमा समाप्त टोकन का उपयोग करने पर ध्यान दें। इस तरह आप दुर्भावनापूर्ण व्यवहारों की निगरानी कर सकते हैं और कुछ निष्कर्ष निकाल सकते हैं।
और यहाँ मेरा छोटा अपग्रेड है। मैं update_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('/');
}
}