Php 密码\u验证未验证数据库中的哈希
我正在尝试登录用户,但每次尝试验证密码时都会出错。用户名验证得很好。我的密码通过密码散列存储在数据库中。例如,假设我注册了一个用户名'thisIsAUser',密码是'thisIsAUsersPassword'。散列格式类似于:Php 密码\u验证未验证数据库中的哈希,php,mysql,sql,mysqli,Php,Mysql,Sql,Mysqli,我正在尝试登录用户,但每次尝试验证密码时都会出错。用户名验证得很好。我的密码通过密码散列存储在数据库中。例如,假设我注册了一个用户名'thisIsAUser',密码是'thisIsAUsersPassword'。散列格式类似于:$2y$10$VR5FKZVLP6/43adb1PsGD.bsmrzp15jdftotz6xubdqtypzrkefw。错误将是if(password\u verify)的else语句。请注意,用户名不匹配的else语句末尾有一个“.”,而密码不匹配的语句结尾有一个“!”
$2y$10$VR5FKZVLP6/43adb1PsGD.bsmrzp15jdftotz6xubdqtypzrkefw
。错误将是if(password\u verify)的else语句。请注意,用户名不匹配的else语句末尾有一个“.”,而密码不匹配的语句结尾有一个“!”
登录脚本:
<?php
session_start();
$link = mysqli_connect("localhost", "root", "Yuvraj123", "KingOfQuiz");
if(mysqli_connect_error()) {
die("Couldn't connect to the database. try again later.");
}
$query = "SELECT * FROM `users`";
if($result = mysqli_query($link, $query)) {
$row = mysqli_fetch_array($result);
}
// define variables and set to empty values
$loginSignupButton = "";
$loginUsername = "";
$loginPassword = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$loginUsername = form_input($_POST["loginUsername"]);
$loginPassword = form_input($_POST["loginPassword"]);
$loginSignupButton = form_input($_POST["loginSignupButton"]);
}
function form_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
// define variables and set to empty values
$loginUsernameError = "";
$loginPasswordError = "";
$error = "";
$loggingInUsername = "";
$unhashedPasswordThingyMajig = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty($_POST["loginUsername"])) {
$loginUsernameError = "<p style='color: red'>Username is required</p>";
echo $loginUsernameError;
} else {
$loginUsername = form_input($_POST["loginUsername"]);
}
if (empty($_POST["loginPassword"])) {
$loginPasswordError = "<p style='color: red'>Password is required</p>";
echo $loginPasswordError;
} else {
$loginPassword = form_input($_POST["loginPassword"]);
}
if($_POST['loginActive'] == "0") {
$query = "SELECT * FROM users WHERE username = '". mysqli_real_escape_string($link, $_POST['loginUsername'])."' LIMIT 1";
$result = mysqli_query($link, $query);
if(mysqli_num_rows($result) > 0) {
$error = "<p style='color: red'>That username is already taken.</p>";
echo $error;
} else {
header ('location: signup.php');
}
} elseif($_POST['loginActive'] == "1") {
$sql = "
SELECT *
FROM users
WHERE username = ?
";
$query = mysqli_prepare($link, $sql);
mysqli_stmt_bind_param($query, "s", $_POST["loginUsername"]);
mysqli_stmt_execute($query);
$result = mysqli_stmt_get_result($query);
if (mysqli_num_rows($result)) {
$logInPassword = $_POST['loginPassword'];
if(password_verify($logInPassword, $row['password'])) {
echo "Hello World!";
} else {
$error = "<p style='color: red'> The Password and Username combination Is not Valid!</p>";
echo $error;
}
} else {
$error = "<p style='color: red'> The Password and Username combination Is not Valid.</p>";
echo $error;
}
}
}
?>
您从未为登录的用户获取行。当您检查$row['password']
时,它检查表中的第一个密码,该密码来自脚本开头的SELECT*from users
查询
在为用户查询行之后,需要调用mysqli\u fetch\u assoc()
if (mysqli_num_rows($result)) {
$logInPassword = $_POST['loginPassword'];
$row = mysqli_fetch_assoc($result);
if(password_verify($logInPassword, $row['password'])) {
echo "Hello World!";
} else {
$error = "<p style='color: red'> The Password and Username combination Is not Valid!</p>";
echo $error;
}
} else {
$error = "<p style='color: red'> The Password and Username combination Is not Valid.</p>";
echo $error;
}
if(mysqli\u num\u行($result)){
$logInPassword=$\u POST['logInPassword'];
$row=mysqli\u fetch\u assoc($result);
如果(密码验证($logInPassword,$row['password'])){
回声“你好,世界!”;
}否则{
$error=“密码和用户名组合无效!
”;
echo$错误;
}
}否则{
$error=“密码和用户名组合无效。
”;
echo$错误;
}
您从未为登录的用户获取行。当您检查$row['password']
时,它检查表中的第一个密码,该密码来自脚本开头的SELECT*from users
查询
在为用户查询行之后,需要调用mysqli\u fetch\u assoc()
if (mysqli_num_rows($result)) {
$logInPassword = $_POST['loginPassword'];
$row = mysqli_fetch_assoc($result);
if(password_verify($logInPassword, $row['password'])) {
echo "Hello World!";
} else {
$error = "<p style='color: red'> The Password and Username combination Is not Valid!</p>";
echo $error;
}
} else {
$error = "<p style='color: red'> The Password and Username combination Is not Valid.</p>";
echo $error;
}
if(mysqli\u num\u行($result)){
$logInPassword=$\u POST['logInPassword'];
$row=mysqli\u fetch\u assoc($result);
如果(密码验证($logInPassword,$row['password'])){
回声“你好,世界!”;
}否则{
$error=“密码和用户名组合无效!
”;
echo$错误;
}
}否则{
$error=“密码和用户名组合无效。
”;
echo$错误;
}
如果您从
$result = mysqli_stmt_get_result($query);
…到代码块的末尾,使用以下命令:;那么它应该会起作用
问题是您从错误的结果集中读取密码
$result = mysqli_stmt_get_result($query);
$dbPassword = mysqli_fetch_assoc($result)["password"] ?? null;
if ($dbPassword) {
$logInPassword = $_POST['loginPassword'];
if(password_verify($logInPassword, $dbPassword)) {
echo "Hello World!";
} else {
$error = "<p style='color: red'> The Password and Username combination Is not Valid!</p>";
echo $error;
}
} else {
$error = "<p style='color: red'> The Password and Username combination Is not Valid.</p>";
echo $error;
}
$result=mysqli\u stmt\u get\u result($query);
$dbPassword=mysqli\u fetch\u assoc($result)[“password”]??无效的
如果($dbPassword){
$logInPassword=$\u POST['logInPassword'];
if(密码\u验证($logInPassword,$dbPassword)){
回声“你好,世界!”;
}否则{
$error=“密码和用户名组合无效!
”;
echo$错误;
}
}否则{
$error=“密码和用户名组合无效。
”;
echo$错误;
}
如果您从
$result = mysqli_stmt_get_result($query);
…到代码块的末尾,使用以下命令:;那么它应该会起作用
问题是您从错误的结果集中读取密码
$result = mysqli_stmt_get_result($query);
$dbPassword = mysqli_fetch_assoc($result)["password"] ?? null;
if ($dbPassword) {
$logInPassword = $_POST['loginPassword'];
if(password_verify($logInPassword, $dbPassword)) {
echo "Hello World!";
} else {
$error = "<p style='color: red'> The Password and Username combination Is not Valid!</p>";
echo $error;
}
} else {
$error = "<p style='color: red'> The Password and Username combination Is not Valid.</p>";
echo $error;
}
$result=mysqli\u stmt\u get\u result($query);
$dbPassword=mysqli\u fetch\u assoc($result)[“password”]??无效的
如果($dbPassword){
$logInPassword=$\u POST['logInPassword'];
if(密码\u验证($logInPassword,$dbPassword)){
回声“你好,世界!”;
}否则{
$error=“密码和用户名组合无效!
”;
echo$错误;
}
}否则{
$error=“密码和用户名组合无效。
”;
echo$错误;
}
你不应该对密码进行清理,因为它会被散列。但是当你调用密码\u验证()
时,你不会使用清理过的密码,所以这并不重要。@Barmar这是Wow建议的一部分(希望是正在进行的)实现,这是一个非常彻底的回顾。像表单输入()这样的函数
在现代代码库中绝对没有任何业务。这些东西给人一种虚假的安全感,破坏数据,隐藏问题。例如,stripslashes()
专门用来处理该功能造成的损坏,该功能设计糟糕得惊人,必须从PHP中永久删除。它现在只会破坏您的输入。您不应该对密码进行清理,因为它将被散列。但是,当您调用password\u verify()
时,您不会使用清理过的密码,所以这其实并不重要。@Barmar这是Wow建议的部分(希望是正在进行的)实现,这是一个非常彻底的回顾。像form\u input()
这样的函数在现代代码库中绝对没有任何用处。这些东西给人一种虚假的安全感,破坏数据,隐藏问题。例如,stripslashes()
专门用来处理该功能造成的损坏,该功能设计糟糕得惊人,必须从PHP中永久删除。它现在只会破坏你的输入。