更改函数以检查用户名||密码


Changing function to check for username || password

我有下面的代码来检查用户名和密码,但我想更改它,以便它检查用户名或密码是否有效。

我想将两个不同的函数checkUsernamecheckPassword作为函数,并对每个输入进行两次回调。

我只是想知道我是否走在了正确的轨道上,或者我的控制器和型号是否可以改变?

型号:

    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注入的一种方式。