用户注册工作正常。注册后,将打开该登录页面,并显示以下消息:密码,用户名和哈希值是我选择行上和回显哈希值时未定义的变量。 尝试登录“无效的登录凭据”时,会弹出错误,还会显示“密码有效”,并且还会打印出哈希。
if (isset($_POST['username']) and isset($_POST['password'])){
// Assigning posted values to variables.
$username = cleanData($_POST['username']);
$password = cleanData($_POST['password']);
$hash = password_hash($password, PASSWORD_DEFAULT);
$verify = password_verify($password, $hash);
if(password_verify($password, $hash)) {
echo 'Password is valid!';
} else {
echo 'Invalid password.';
}
}
// Checking if the values exist in the database or not
$query = "SELECT * FROM `user` WHERE (username='$username') AND (password='$password')";
echo $hash;
$result = mysqli_query($connection, $query) or die(mysqli_error($connection));
$count = mysqli_num_rows($result);
// If the posted values are equal to the database values, then session
is created for the user.
if ($count == 1){
$_SESSION["loggedIn"] = true;
$_SESSION['username'] = $username;
}else{
// error for not matching credentials
$fmsg = "Invalid Login Credentials.";
我怀疑我的SELECT语句的位置和要求做错了什么,但这仍然不能解释为什么这些变量未定义。也许我可以移动SELECT语句来替换“ password is valid”消息,然后从那里去? CleanData是用于清理输入的功能。
答案 0 :(得分:0)
因此,问题在于您正在这样做:
if (username and password are set) {
username = xxx
password = xxx
hash password
verify password
display results
}
do sql query based on username and password
因此,您的原始IF之外的代码正试图利用可能尚未创建的变量。
即使您没有将用户名和密码传递到php页面,您的SQL查询和此后的所有代码也会被调用。
您最好在脚本开头执行以下操作:
if (username and password are not both set in post vars)
display error
exit
}
username = xxx
password = xxx
然后,您可以肯定地定义了这些var,而不必在页面中反复检查。
此外,伪代码是故意的。试图用外行的话传达我的信息:)
答案 1 :(得分:0)
使用此代码,您将始终收到“ password is valid”消息,因为您正在根据由同一密码生成的哈希值来验证用户输入的密码! >
<!-- Incorrect code: This always determines the password is valid! -->
$hash = password_hash($password, PASSWORD_DEFAULT);
if (password_verify($password, $hash)) {
echo 'Password is valid!';
}
第一次将密码插入数据库时,应该使用password_hash
(那样,您就不会存储实际的密码,而只是存储哈希值)。然后,当您的用户使用其用户名登录时,在数据库中查找具有该用户名的用户。如果找到具有该用户名的用户,请使用password_verify
来检查$password
变量是否与该用户存储在数据库中的哈希值相符。
查看this answer来回答类似的问题,以查看充实的登录代码示例。