0

たとえば、誰かが「Bob」という名前でログインしようとしましたが、データベースにBobがありません。ボブがいないことをユーザーに通知する必要がありますか、それともプログラムが単に「認証に失敗しました」と言う必要がありますか(Gmailがこれを行うことに気づきました)?これは、一部はユーザビリティの質問であり、一部は効率の質問です。現在、プログラムはデータベースにクエリを実行して、指定されたユーザー名が存在するかどうかを確認し、存在する場合は、データベースに再度クエリを実行して、同じユーザー名(冗長)のパスワードハッシュを検索します。

//$link is the link to the database storing passwords/usernames
if(userNameExists($uName, $link))
{
    if(passwordCorrect($uName, $pass, $link))
        echo 'log in successful!';
    else
        echo 'can\'t log in';
}
else
{
    echo 'username doesn\'t exist!';
}

/*This function checks to see if the username exists
INPUT: the userName to check for and a link to the database
OUTPUT: true if username exists
*/
function userNameExists($userName, $link)
{
    $result = mysqli_query($link, 'SELECT `userid`
                        FROM `login`
                        WHERE `userid` = \''.$userName.'\' LIMIT 1');//need to look into uses of backticks, single quotes, double quotes
    return mysqli_num_rows($result) == 1;
}

/*This function checks the password for a given username
INPUT: the userName and password the user entered, and a link to the database
OUTPUT: true if the given password matches the one in the database
*/
function passwordCorrect($userName, $givenPassword, $link)
{
    $result = mysqli_query($link, 'SELECT `password`
                        FROM `login`
                        WHERE userid = \''.$userName.'\' LIMIT 1');
    $retrievedPassword = mysqli_fetch_array($result);
    if(password_verify($givenPassword, $retrievedPassword['password']))
        return true;
    else
        return false;
}

代わりに使用する必要がpasswordCorrect()あり、falseが返された場合、mysqli_query()これはユーザー名が存在しないことを意味します(確かに、他の問題が発生した可能性があるため、これらのソリューションは好きではありませんね)。

4

2 に答える 2

2

ログインが失敗した理由(ユーザーが存在しないか、パスワードが間違っている)の詳細を提供しないでください。これにより、セキュリティが向上します。ログインしていないときにユーザー名が表示されない限り(これは実際には安全ではなく、そうではないはずです..!)

利点は、実際に単一のクエリを使用して、指定されたユーザー名のハッシュを取得できることです。結果が得られない場合は、ユーザー名が間違っています(そしてログインに失敗しました)。そうでない場合は、ハッシュを(直接)チェックできます(パスワードが間違っているかどうかを確認します)。

于 2013-01-21T22:31:53.850 に答える
1

大まかに言えば、この話には2つの基本的なポイントがあります。

  1. 特定の情報を提供すると、ユーザーは自分が提供した情報のどの部分が間違っていたかがわかるため、使いやすさが向上する可能性があります。

  2. しかし、特定の情報を提供することは、潜在的な悪用も可能にします。ユーザー名が存在しない場合に具体的に戻ると、ハッカーにユーザー名存在することを警告する可能性があり、ハッカーはその情報を使用して、ブルートフォース手法を使用してログインをクラックする可能性があります。

状況に最も適しているのは常にトレードオフですが、前述のセキュリティ上の理由から、特定の情報を省略することをお勧めします。

于 2013-01-21T22:34:04.493 に答える