2012-02-11 3 views
0

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

Я думал о создании двух разных функций 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; 

      } 

ответ

1

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

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

+0

Не поймите меня на MD5, поэтому я переделываю код. Вы только что дали мне действительную точку :) –

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; 

} 
+0

Есть ли $ match_both a CI var? –

+0

Нет, это просто обычная старая переменная. Вы можете вызвать 'login_model-> check_login ($ user, $ pass, TF)', где TF является либо «true», либо «false», чтобы изменить способ работы функции - прокрутите вправо и полностью прочитайте запрос – Joe

0

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

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

+0

OP явно использует подготовленные здесь, так что 'mysql_escape_string' будет шагом назад. – rdlowrey

Смежные вопросы