私はこのようなcodeigniterモデルを持っています
<?php
class Model_Login extends CI_Model{
function __construct(){
parent::__construct();
}
public function login_submit($arrayData){
extract($arrayData);
$username=clean($txtusername);
$password=clean($txtpassword);
//first get salt for the respective user.
$getsalt=$this->db->query("SELECT PASSWORD_SALT FROM USER_INFOS WHERE USER_NNAME=?",array($username))->row();
$salt=$getsalt->PASSWORD_SALT;
$password=sha1($salt.$password);
$query=$this->db->query("SELECT * FROM USER_INFOS WHERE STATUS='Y' AND USER_NNAME=? AND USER_PASSWORD=?",array($username,$password));
if($query->num_rows>0){
$row=$query->row();
// login successfull create session
$this->session->set_userdata('USER_ID', $row->USER_ID);
$this->session->set_userdata('USER_FULL_NAME', $row->USER_ENAME);
return "success";
}else{
return "Invalid username and/or password.";
}
}
}
?>
ここで、PASSWORD_SALTは、関数を使用してハッシュされた128文字の長さのランダム(ユーザーごと)のソルトを含むデータベースフィールドですhash
。
USERNAME
が一意である場合、コードは完全に機能します。しかし、ユーザー名が一意であってはならないことを尋ねる可能性のあるクライアントについて考えようとしています。ユーザー名が一意でない場合は、常に最初の行が選択され、同じユーザー名を持つものを除いて、有効なユーザー名とパスワードが提供されていてもログインできません。
このシナリオでより良い回避策は何でしょうか?
編集
ユニークではないことを置くUSERNAME
のは悪い考えだと私は知っています。しかし、私たちの国には、ユーザー名が一意ではない(または、場合によってはユーザー名が予測可能でさえある)いくつかのWebサイトがあります。たとえば、銀行の特定の支店に支店コードが032
、私の名前がJohn Smithであるアカウントがあり、そのebankingにアクセスするためのユーザー名はになり032JOHNS
ます。その支店には、最終的に同じユーザー名を持つ複数のJohnSmithが存在する可能性があります。そして、彼らのebankingシステムにログインするには、このユーザー名とパスワードを入力するだけです。
ありがとう