たとえば、誰かが「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()
これはユーザー名が存在しないことを意味します(確かに、他の問題が発生した可能性があるため、これらのソリューションは好きではありませんね)。