我有以下代码检查用户名和密码,但我想更改它,以便检查用户名或密码是否有效。
我正在考虑将两个不同的函数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;
}
答案 0 :(得分:1)
您是否希望确定某个用户名是否存在?如果没有,我认为没有理由添加额外的功能。如果提交的密码无效,让客户知道用户名有效通常被认为是一种不好的做法。它让恶意的人知道他们已经解决了50%的难题,让他们只能破解密码。此外,我无法想象您想要检查密码是否存在的情况。
我会从您的代码中注意到,md5
已被破坏,而sha1
实际上是存储密码的最佳选择。否则,如果没有仔细检查代码寻找微小的改进,我会说你已经使用准备好的语句与你的输入,其他一切看起来没问题,所以你可能没事。
答案 1 :(得分:0)
最简单的选项:更改模型,以便指定是否检查一个或两个。
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;
}
答案 2 :(得分:0)
最好首先检查用户名,然后进行passwrd检查。 这样会更安全。
并使用mysql_real_escape_string()来输入输入的用户名和密码中的特殊字符。否则这将成为sql注入的一种方式。