Php 使用准备好的语句登录-无法使用用户名/密码登录

Php 使用准备好的语句登录-无法使用用户名/密码登录,php,mysqli,login,prepared-statement,Php,Mysqli,Login,Prepared Statement,我正在使用准备好的语句登录,但无法使用任何密码和用户名对登录。我不知道为什么。似乎$result=$stmt->get\u result;从不返回false,因为当我打印$result时,我会得到: 我该如何解决这个问题 代码 get_results失败时返回FALSE,否则返回准备语句中要求的数据集。您将获得0行,这意味着没有具有此类用户名和密码的用户。您依赖于FALSE而不是0行来显示用户名或密码不正确,这是错误的。只有在执行准备好的语句时出错,才会返回FALSE。 如果您担心0结果返回的原

我正在使用准备好的语句登录,但无法使用任何密码和用户名对登录。我不知道为什么。似乎$result=$stmt->get\u result;从不返回false,因为当我打印$result时,我会得到:

我该如何解决这个问题

代码

get_results失败时返回FALSE,否则返回准备语句中要求的数据集。您将获得0行,这意味着没有具有此类用户名和密码的用户。您依赖于FALSE而不是0行来显示用户名或密码不正确,这是错误的。只有在执行准备好的语句时出错,才会返回FALSE。 如果您担心0结果返回的原因,并希望正确登录,则如果计算出的密码哈希与存储在数据库中的哈希不匹配,则可能会发生这种情况。

未筛选方法:

if(isset($_POST["Logsub"]) && !empty($_POST["username"]) && !empty($_POST["password"])){
    $username=$_POST["username"];
    $password=hash("sha256",$_POST["password"]);
    $query="SELECT * FROM login WHERE username=? AND password=?";
    if($stmt=$mysqli->prepare($query)){
        if($stmt->bind_param('ss',$username,$password) &&
           $stmt->execute() && 
           $stmt->store_result()
        ){
            if($result=$stmt->get_result()){
                echo "<div class=\"message\">You have been successfully logged in.</div>";
            }else{
                echo "<div class=\"message\">Invalid username or password. Please try again.</div>";
            }
        }else{
            echo "Statement Error: ",$stmt->error;  // do not echo when public
        }
        $stmt->close(); 
    }else{
        echo "Prepare Error: ",$mysqli->error;  // do not echo when public
    }
    $mysqli->close();
}else{
    echo "Insufficient or invalid credentials submitted";
}
您可以将两个初始条件语句合并为一个。 您可能在筛选/清理时损坏了密码值。您可以信任您准备好的语句,以确保查询不会被注入;所有这些预过滤都是不必要的。 $stmt=$mysqli->stmt\u init;在手册中有,但是准备好的语句没有它就可以工作,大多数人只是把胸径直接放在准备上;这是我的偏好。 我已将所有stmt操作批处理到一个条件语句中。如果任何条件失败,php将立即转到else条件并显示错误。 我声明了$result,以防您想在实际项目中使用它。 如果此代码块不允许使用正确的凭据登录,请将$query、$username和hash'ed$password粘在一起,并直接在数据库上运行,以确保它与行匹配


*我在发布之前没有测试过这段代码

不建议转义或清除密码,尤其是当涉及到123'\abc等完全有效的密码时。在转义这些时,如果您使用password\u散列存储散列密码,它会将其重写为123\'\abc,而密码验证失败,您应该使用密码散列存储散列密码;sha系列不是很好。sanitise filter和preg_match两者都做没有多大意义,你实际上不应该这样做。我应该在密码上运行trim、stripslashes和htmlspecialchars吗?“tiger192,3”是更好的散列算法吗?@Fred-ii-我应该运行htmlspecialchars而不是消毒吗?@nogad建议使用什么?
if(isset($_POST["Logsub"])){
    if(!empty($_POST["username"]) && !empty($_POST["password"])){
        $username = filter_var($_POST["username"], FILTER_SANITIZE_STRING);

        $password_sanitized = filter_var($_POST["password"], FILTER_SANITIZE_STRING);
        $password = hash( "sha256", $password_sanitized ); //"sha256" is a type of hashing algorithm 

        if(preg_match("/^[a-zA-Z0-9]+$/", $username)&& preg_match("/^[a-zA-Z0-9]+$/", $password)){
            $query = "SELECT * FROM login WHERE username = ? AND password = ?";
            $stmt = $mysqli->stmt_init();

            if ($stmt->prepare($query)) {
                $stmt->bind_param('ss', $username, $password );
                $stmt->execute();

                //Returns a resultset for successful SELECT queries, or FALSE
                $result = $stmt->get_result();

                //If results (query for username and password that was entered) returns false
                if(!$result) {
                    echo "<div class = 'message'> Invalid username or password. Please try again </div>";
                } else {
                    echo "<div class = 'message'> You Have Been Successfully Logged In. </div>";
                }
            }
            $stmt->close(); 
        } 
    }
}
`login` (`username`, `password`) VALUES (username, 'someHashedPassword');
if(isset($_POST["Logsub"]) && !empty($_POST["username"]) && !empty($_POST["password"])){
    $username=$_POST["username"];
    $password=hash("sha256",$_POST["password"]);
    $query="SELECT * FROM login WHERE username=? AND password=?";
    if($stmt=$mysqli->prepare($query)){
        if($stmt->bind_param('ss',$username,$password) &&
           $stmt->execute() && 
           $stmt->store_result()
        ){
            if($result=$stmt->get_result()){
                echo "<div class=\"message\">You have been successfully logged in.</div>";
            }else{
                echo "<div class=\"message\">Invalid username or password. Please try again.</div>";
            }
        }else{
            echo "Statement Error: ",$stmt->error;  // do not echo when public
        }
        $stmt->close(); 
    }else{
        echo "Prepare Error: ",$mysqli->error;  // do not echo when public
    }
    $mysqli->close();
}else{
    echo "Insufficient or invalid credentials submitted";
}