Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 密码\u验证未验证数据库中的哈希_Php_Mysql_Sql_Mysqli - Fatal编程技术网

Php 密码\u验证未验证数据库中的哈希

Php 密码\u验证未验证数据库中的哈希,php,mysql,sql,mysqli,Php,Mysql,Sql,Mysqli,我正在尝试登录用户,但每次尝试验证密码时都会出错。用户名验证得很好。我的密码通过密码散列存储在数据库中。例如,假设我注册了一个用户名'thisIsAUser',密码是'thisIsAUsersPassword'。散列格式类似于:$2y$10$VR5FKZVLP6/43adb1PsGD.bsmrzp15jdftotz6xubdqtypzrkefw。错误将是if(password\u verify)的else语句。请注意,用户名不匹配的else语句末尾有一个“.”,而密码不匹配的语句结尾有一个“!”

我正在尝试登录用户,但每次尝试验证密码时都会出错。用户名验证得很好。我的密码通过密码散列存储在数据库中。例如,假设我注册了一个用户名'thisIsAUser',密码是'thisIsAUsersPassword'。散列格式类似于:
$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中永久删除。它现在只会破坏你的输入。