1

私は自分のマシンで練習するための簡単なユーザーログインシステムに取り組んでいます。

ユーザー名、パスワード、および電子メールを持つmysqlテーブルユーザーがいます。次の方法で新しいユーザーを登録できました。

//short variable names:

$email = $_POST['email'];
$username = $_POST['username'];
$password = $_POST['password'];
$password2 = $_POST['password2'];

session_start();

//attempt to register
register($username, $email, $password); 

次の関数を使用して動作するdbに入力するこの関数を作成しました。

 function register($username, $email, $password){
//register new person with db
//return true or error

//connect to db
$db = db_connect();

//check if username is unique
$result = $db->query("SELECT * from user where username = '".$username."'");
if(!$result){
    throw new Exception('Could not execute query');
}

if($result->num_rows>0){
    throw new Exception('That username is taken - go back and choose another one.');
}

//if ok, put in db
$result = $db->query("INSERT into user values
        ('".$username."', sha1('".$password."'), '".$email."')");

if(!$result){
    throw new Exception('Could not register you in database - Please try again later.');
}

return true;

}

次に変数を登録しました

//register session variable
$_SESSION['valid_user'] = $username;

echo 'Your registration was successful. Go to the members page to start setting up your profile!';

ユーザー名とパスワードを使用してログインしようとすると、ここでは機能しません。ログインコードは次のとおりです。

function login($username, $password){
//check username and password with db
$db = db_connect();

//check if username unique
$result = $db->query("SELECT * FROM user where username = '".$username."' and password = sha1('".$password."')");
if(!$result){
    throw new Exception('Could not log you in.');
}
if($result->num_rows > 0){
    return true;
} else {
    throw new Exception('Could not log you in.');
}
}

安全ではないことを理解しています。それは私のマシンで練習しているだけなので、上に移動できます。誰か説明がありますか?パスワードはdbにsha1varcharとして登録されていますが、これは正しく行われていないと思いますか?

助けてくれてありがとう

4

2 に答える 2

1

ほとんどの場合、問題はパスワードのVARCHAR定義にあります。sha1の長さは160ビットです。

とにかく、パスワードをVARCHARフィールドに保存することはお勧めしません。代わりに、BINARY(20)UNHEX関数を使用してSHA1値をバイナリに変換します。

データベースに多くのレコード(数千、数百万)がある場合、binary(20)はvarcharやcharよりもはるかに少ないメモリを使用します。

または、 CHAR(40)に変更します

于 2013-03-19T21:25:25.553 に答える
-1

試す

function login($username, $password){
//check username and password with db
$db = db_connect();

//check if username unique
$result = $db->query("SELECT * FROM user where username = '".$username."' and password = sha1('".$password."')");
if(!$result){
    throw new Exception('Could not log you in.');
}
if(mysql_num_rows($result) > 0){
    return true;
} else {
    throw new Exception('Could not log you in.');
}
}

num行をチェックする条件を変更しました。

于 2013-03-19T21:32:57.647 に答える