php - PHP的登录问题
问题描述
我还不能修复它,我不知道是什么问题。我在xampp上使用它。我在我的 register.php 中将哈希更改为 sha256。现在,如果我尝试使用我注册的密码和用户名登录,它会说用户名和密码错误。
那是我的 login.php
if(empty($username_err) && empty($password_err)){
// Prepare a select statement
$sql = "SELECT id, username, password FROM users WHERE username = ?";
if($stmt = mysqli_prepare($link, $sql)){
// Bind variables to the prepared statement as parameters
mysqli_stmt_bind_param($stmt, "s", $param_username);
// Set parameters
$param_username = $username;
// Attempt to execute the prepared statement
if(mysqli_stmt_execute($stmt)){
// Store result
mysqli_stmt_store_result($stmt);
// Check if username exists, if yes then verify password
if(mysqli_stmt_num_rows($stmt) == 1){
// Bind result variables
mysqli_stmt_bind_result($stmt, $id, $username, $hashed_password);
if(mysqli_stmt_fetch($stmt)){
if(password_verify($password, $hashed_password)){
// Password is correct, so start a new session
session_start();
// Store data in session variables
$_SESSION["loggedin"] = true;
$_SESSION["id"] = $id;
$_SESSION["username"] = $username;
// Redirect user to welcome page
header("location: welcome.php");
} else{
// Password is not valid, display a generic error message
$login_err = "Invalid username or password.";
}
}
} else{
// Username doesn't exist, display a generic error message
$login_err = "Invalid username or password.";
}
} else{
echo "Oops! Something went wrong. Please try again later.";
}
// Close statement
mysqli_stmt_close($stmt);
}
}
// Close connection
mysqli_close($link);
那是我的 register.php 我只改变了。
if(empty($username_err) && empty($password_err) && empty($confirm_password_err)){
// Prepare an insert statement
$sql = "INSERT INTO users (username, password) VALUES (?, ?)";
if($stmt = mysqli_prepare($link, $sql)){
// Bind variables to the prepared statement as parameters
mysqli_stmt_bind_param($stmt, "ss", $param_username, $param_password);
// Set parameters
$param_username = $username;
$param_password = hash("sha256" , $_POST['password']); // Creates a password hash //<------------------THAT IS CHANGED
// Attempt to execute the prepared statement
if(mysqli_stmt_execute($stmt)){
// Redirect to login page
header("location: login.php");
} else{
echo "Oops! Something went wrong. Please try again later.";
}
// Close statement
mysqli_stmt_close($stmt);
}
}
// Close connection
mysqli_close($link);
}
解决方案
那是因为您的纯密码永远不会与 SHA256 加密文本匹配您可以尝试将纯密码再次转换为 sha256 并进行比较,但这是一种不好的做法,就像劳伦斯所说的那样,您不应该将密码存储在其中格式
password_verify 与 password_hash 一起使用,您可以在其中提供纯密码和哈希算法,请参见此处的文档
推荐阅读
- javascript - 如何监听可滚动元素上的滚动事件?
- javascript - 从循环生成的文本框中输入的数字相加
- json - 从 SQL Server 表列解析 JSON 数据
- html - IE上的全屏视频
- javascript - JS在同类型的类中创建属性
- python - 未能 mock.patch 列表理解中调用的方法字典
- swift - 连接socket.io成功后如何获取数据?
- c# - Dot Net Core 使用 NLog 创建日志文件,但从不记录任何内容
- python-3.x - 在python中将键值对添加到键的问题
- reactjs - React 嵌套路由不会通过 Link 更新