更改功能以检查用户名||密码

时间:2012-02-11 05:25:07

标签: php codeigniter

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

我正在考虑将两个不同的函数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;

            }

3 个答案:

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