Изменение функции для проверки имени пользователя ||пароль - PullRequest
0 голосов
/ 11 февраля 2012

У меня есть следующий код, который проверяет и имя пользователя, и пароль, но я хотел бы изменить его, чтобы он проверял, является ли имя пользователя или пароль действительными.

Я думал о том, чтобы сделать две разные функции 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;

            }

Ответы [ 3 ]

1 голос
/ 11 февраля 2012

Будет ли у вас когда-нибудь сценарий, в котором вы хотите определить, существует ли имя пользователя само по себе?Если нет, я не вижу причин для добавления дополнительных функций.Обычно считается плохой практикой сообщать клиенту, что имя пользователя было действительным, если был введен неверный пароль.Это позволяет злоумышленнику узнать, что он решил 50% головоломки, и освободил его только для взлома пароля.Кроме того, я не могу представить сценарий, когда вы захотите проверить, существует ли пароль самостоятельно.

Одна вещь, которую я хотел бы отметить из вашего кода, это то, что md5 был взломан и sha1 действительно лучший вариант для хранения паролей в наши дни.В противном случае, не перебирая код в поисках крошечных улучшений, я бы сказал, что вы использовали подготовленные операторы со своими входными данными, а все остальное выглядит хорошо, так что вы, вероятно, в порядке.

0 голосов
/ 11 февраля 2012

Да, лучше сначала проверить имя пользователя, затем перейти к проверке пароля. таким образом, это будет более безопасно.

и используйте mysql_real_escape_string () для удаления специальных символов из введенного имени пользователя и пароля. иначе есть способ для инъекции sql.

0 голосов
/ 11 февраля 2012

Самый простой вариант: измените модель, чтобы вы могли указать, проверять ли одну или обе.

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;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...