2012-02-11 3 views
0

사용자 이름과 암호를 모두 확인하는 다음 코드가 있지만 사용자 이름이나 암호가 유효한지 확인하도록 변경하려고합니다.사용자 이름을 확인하는 기능 변경 || 암호

두 개의 서로 다른 함수 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; 

      } 

답변

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는 (는) CI 변수입니까? –

+0

아니, 그냥 규칙적인 오래된 변수 일 뿐이야. TF가'true'이거나'false' 인 곳에서'login_model-> check_login ($ user, $ pass, TF)'함수를 호출하여 함수가 어떻게 동작 하는지를 바꿀 수 있습니다 - 오른쪽으로 스크롤하고 쿼리를 완전히 읽으십시오 – Joe

0

예를 들어 먼저 사용자 이름을 확인한 다음 passwrd check로 이동하는 것이 좋습니다. 그런 식으로하면 더 안전합니다.

그리고 입력 된 사용자 이름과 암호에서 특수 문자를 이스케이프 처리하려면 mysql_real_escape_string()을 사용하십시오. 그렇지 않으면 theere가 SQL injection을위한 방법이 될 것입니다.

+0

OP가 명확하게 준비를 사용하고 있습니다 mysql_escape_string은 한 걸음 뒤로 물러날 것이다. – rdlowrey

관련 문제