我正在登录用户。因此,在用户输入电子邮件和密码后,我想检查具有该电子邮件和密码的用户是否存在。出于这个原因,我使用了两次 where 子句,但不知何故它不起作用。也许是因为我使用不正确。如何修复我的以下代码
$this->db->where('email', $this->input->post('email'));
$this->db->where('password', $pass . $salt);
我正在登录用户。因此,在用户输入电子邮件和密码后,我想检查具有该电子邮件和密码的用户是否存在。出于这个原因,我使用了两次 where 子句,但不知何故它不起作用。也许是因为我使用不正确。如何修复我的以下代码
$this->db->where('email', $this->input->post('email'));
$this->db->where('password', $pass . $salt);
哪里工作正常,第二个是错误的,你传递了密码+盐,但你没有编码任何东西,只是连接它们。因此,如果您的密码是 bob 并且您的 salt 是胡椒,那么您将 bobpepper 作为密码字段传递给查询。
根据加密,您的代码应类似于以下内容:
$password = md5($this->input->post('password'). $salt); //swap the md5 for whatever encryption method you're using.
$this->db->where('email', $this->input->post('email'));
$this->db->where('password', $password);
您不需要执行两次 where 子句。
public function login(){
try
{
$user = $this->db->select()->where()->get(); // mysql query
if( !$user)
throw new Exception("User not found!");
if( !$this->compare_password($this->input->post('password'), $user->password ) )
throw new Exception("Passwords did not match!");
}
catch(Exception $e)
{
$this->session->set_flashdata('error', $e->getMessage());
log_message('error', $e->getMessage());
redirect('/');
}
//we got this far so everything should be OK
$this->session->set_flashdata('success', 'Login Successfull');
redirect('dashboard');
}
注意:您可能希望在生产模式下使用比这更好的密码哈希算法!!
protected function hash_password($password){
return sha1( $pw . $this->config->item('encryption_key') );
}
protected function compare_password($pw, $dbpw){
return ( sha1($pw . $this->config->item('encryption_key') ) === $dbpw )
}