-4

最近、ユーザーがサインアップして自分のアカウントを作成できる登録ページを作成しました。しかし、ログアウトしてからアカウントに戻ってログインしようとすると、暗号化されたパスワードのみが受け入れられます。loguserin 関数をデータベースと通信させ、それが実際にはユーザーが最初に入力した通常のパスワードであることを認識させるにはどうすればよいですか?

コントローラ:

 function loguserin()
 {

$this->load->helper(array('form', 'url'));

$this->load->library('form_validation');

$this->form_validation->set_rules('username', 'Username', 'required|min_length[4]|max_length[12]|callback_validateUser|trim');
$this->form_validation->set_rules('password', 'Password', 'required|md5|trim');


if ($this->form_validation->run())
{
    $username = $this->input->post('username');
    $password = $this->input->post('password');
    $this->session->set_userdata('status', 'OK');
    $this->session->set_userdata('username', $username);

    redirect('home');
}
else
{
    $this->session->set_userdata('status', 'NOT_OK');
    $this->load->view('shared/header');
    $this->load->view('account/logintitle');
    $this->load->view('account/loginview');
    $this->load->view('shared/footer');
}
 }



  function validateUser($username, $password)
  {
    $this->db->select('*')->from('membership');
    $this->db->where('username', $username);
    $this->db->where('password',MD5($password));
    $query = $this->db->get();
    if ($query ->num_rows ==1)
    {
    $this->form_validation->set_message('validateUser', 'Invalid username/password');

    return false;
}

else{

    return true;

}
}
4

3 に答える 3

1

あなたの問題は、セキュリティ上の理由から、登録時にパスワードがハッシュされることだと私には思えます。

この場合、どのハッシュ関数が使用されたかを知る必要があります。たとえばcrypt。クエリを実行する前に、ユーザー入力を単純に暗号化する必要があります。

    $hashedPassword = crypt($password);
    $this->db->select('*')->from('membership');
    $this->db->where('username', $username);
    $this->db->where('password', $hashedPassword);
    $query = $this->db->get();

パスワードのハッシュ化に関する PHP の推奨事項は次のとおりです

于 2012-12-29T22:05:26.003 に答える
1

CodeIgniter が MD5 でパスワードを暗号化していないように見えるかもしれません。で指定されているset_rules()とおり:

$this->form_validation->set_rules('password', 'Password', 'required|md5|trim');

これを確認する 1 つの方法は、その内容をディスプレイにダンプすることです。例えば..

var_dump( $this->input->post('password') );

パスワードがまだプレーン テキストのように見える場合。set_rules は変数に対して md5() を実行していないため、トラブルシューティングが必要になります。

将来の参考のために、通常、認証システムはデータベースにユーザーの詳細を持っています。パスワードとユーザー名のハッシュ化されたバージョンを含みます。PHP アプリケーションは、次のような SQL コマンドを起動しますSELECT password FROM users WHERE USERNAME=username行が返されない場合は、ユーザー名が正しくありません

次に、ユーザー入力がハッシュ メソッドを介して実行されます。これは、データベースから取得した値と比較されます。これらが一致しない場合、パスワードが間違っています。

ただし、データベースクエリでパスワードとユーザー名の両方を送信しているようです。これは機能しますが、認証の問題を引き起こしているユーザー名が間違っているのか、パスワードが間違っているのかを判断することはできません。

このような理由から、多くの場合、...

認証フレームワークを試して使用する

撃墜される危険があります。本番プロジェクト用に独自の認証コードを作成しようとしないでください。ちょっとした見落としがあれば、アプリケーション全体やユーザー データなどを危険にさらす可能性があります。

試行錯誤された本当に優れた認証フレームワークがいくつかあります。私のお気に入りは、そのシンプルさからイオン認証です。しかし、もっと好きな人が見つかるかもしれません。

パスワードを暗号化するだけではいけません。それらをハッシュします。

微妙な違いのように聞こえるかもしれません。しかし、実際には非常に重要です。データベースが危険にさらされた場合 (かなり厄介です!)、パスワードをハッシュ化すると、セキュリティが向上します。特にレインボーテーブルのような攻撃が関係している場合.

同様に、使用しないでくださいmd5()- PHP にはcrypt()、より安全なアルゴリズムを試して使用する機能があります -システムで利用可能な場合さらに、2 番目の引数 (オプションですが、使用する必要があります) - saltを受け入れます。

set_rules()を使用できることを覚えておく価値がありますcrypt()。少なくとも最も単純な形式 (引数が 1 つ) では。ドキュメントから:

htmlspecialchars、trim、MD5 など、1 つのパラメーターを受け入れる任意のネイティブ PHP 関数をルールとして使用できます。

于 2012-12-29T22:41:46.363 に答える
-1

パスワードの保存に使用しているハッシュに応じて、モデルの構成は次のようになります。

$this->db->select('*')->from('membership');
$this->db->where('username', $username);
$this->db->where('password', MD5($password));

また、ユーザーが有効かどうかを確認するためのモデルにバグがあります。DBから返される行数が1の場合、ユーザーは有効です。それ以外の場合は無効です。

if ($query->num_rows == 1)
    {
        return true;
    }

else
{
    $this->form_validation->set_message('validateUser', 'Invalid username/password');
    return false;
}
于 2012-12-29T21:56:01.060 に答える