2012-02-11 13 views
0

私はユーザー名とパスワードの両方をチェックする次のコードを持っていますが、ユーザー名またはパスワードが有効かどうかをチェックするように変更したいと思います。ユーザー名を確認する関数の変更||パスワード

私は2つの異なる関数checkUsernamecheckPasswordを関数として考えていて、各入力に対して2つのコールバックを持っていました。

私はちょうど私が正しいトラックにいるのか、コントローラとモデルがどのように変更できるのかを知りたいのですが?

モデル:

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%を解決したことを知らせるだけで、パスワードを解読できるようになります。さらに、自分のパスワードが存在するかどうかを確認するシナリオを想像することはできません。

あなたのコードから覚えておいていただきたいことの1つは、md5が壊れており、最近sha1が本当にパスワードを保存するためのより良いオプションであるということです。さもなければ、小さな改善を探しているコードを徹底的に調べることなく、私はあなたがあなたの入力と準備されたステートメントを使ったと言いたいと思います。

+0

私はMD5を使い始めません。なぜコードをやり直すのですか?あなたはちょうど私に有効なポイントを与えている:) –

0

最も簡単なオプション:あなたは、1つまたは両方をチェックするかどうかを指定することができるように、モデルを変更します。

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 varですか? –

+0

いいえ、これはちょうど普通の古い変数です。関数がどのように動作するかを変更するには、TFが 'true'または' false'のどこで 'login_model-> check_login($ user、$ pass、TF)'を呼び出すことができます - 右にスクロールしてクエリを完全に読み取る – Joe

0

はい、最初にユーザー名を確認してからpasswrd checkに行ってください。 そのようにすれば、より安全になります。

を入力し、入力されたユーザー名とパスワードに特殊文字を追加するには、mysql_real_escape_string()を使用します。それ以外の場合は、SQLインジェクションの方法になります。

+0

OPは、 mysql_escape_stringは後方に進むでしょう。 – rdlowrey