我有下面的代码来检查用户名和密码,但我想更改它,以便它检查用户名或密码是否有效。
我想将两个不同的函数checkUsername
和checkPassword
作为函数,并对每个输入进行两次回调。
我只是想知道我是否走在了正确的轨道上,或者我的控制器和型号是否可以改变?
型号:
function check_login($username,$password) {
$query = $this->db->query("SELECT id, first_name, last_name, email, password FROM users WHERE email = ? and password = ?", array($username, md5($password))); // Result
return ($query->num_rows() == 1) ? $query->row() : FALSE;
}
}
控制器:
function _checkUsernamePassword() {
// adding the _ makes the function 'private' so it can't be called from the URI.
extract($_POST); // Gets data from form and creates vars
$user = $this->login_model->check_login($username,$password);
if(! $user){ // != If username or password are not correct
$this->session->set_flashdata('login_error',TRUE); //does not add the non valid login to the session
$this->form_validation->set_message('_checkUsernamePassword', 'Sorry %s is not correct.');
return FALSE;
} else {
$this->session->set_userdata('logged_in',TRUE);
$this->session->set_userdata('user_id',$user->id);
$this->session->set_userdata('user_name',$user->first_name);
$this->session->set_userdata('user_email',$user->email);
return TRUE;
}
您是否有过想要确定用户名是否单独存在的场景?如果没有,我认为没有理由添加额外的功能。如果提交了无效的密码,让客户端知道用户名是有效的通常被认为是一种糟糕的做法。它让恶意的人知道他们已经解决了50%的谜题,让他们只能破解密码。此外,我无法想象你想要检查密码是否单独存在的情况。
我想从您的代码中注意到的一件事是,md5
已经损坏,而sha1
现在确实是存储密码的更好选择。否则,如果不仔细研究代码以寻找微小的改进,我会说您已经在输入中使用了准备好的语句,其他一切看起来都很好,所以您可能很好。
最简单的选项:更改模型,这样您就可以指定是检查其中一个还是同时检查两个。
function check_login($username,$password, $match_both = true) {
$query = $this->db->query("SELECT id, first_name, last_name, email, password FROM users WHERE email = ? " . ($match_both ? 'AND' : 'OR') . " password = ?", array($username, md5($password))); // Result
return ($query->num_rows() == 1) ? $query->row() : FALSE;
}
是的,最好先检查用户名,然后再进行密码检查。这样会更安全。
并使用mysql_real_eescape_string()来捕捉输入的用户名和密码中的特殊字符。否则,weare将成为sql注入的一种方式。