PHP密码登录从用户输入和密码中获取密码,但不进行验证

PHP密码登录从用户输入和密码中获取密码,但不进行验证,php,tsql,passwords,Php,Tsql,Passwords,我有php,它提取正确的登录数据,还有用户输入的密码,这两个都是散列的。当使用密码_verify时,它会显示false。错误报告不返回任何错误。我似乎不明白为什么它不起作用 存储的密码为:$2y$10$pah82g8RHELhYP/MJEGNcuOFeg6u60.NUTigLSxrezhMMCAc7jvSi 用户密码哈希为:$2y$10$gd9GsmfchKKLwPX1jG.6YEVUGZGSLTLG7TFCW3WSKLXBW6GTBXXXE 验证返回:boolfalse 目前,SQL注入并不重

我有php,它提取正确的登录数据,还有用户输入的密码,这两个都是散列的。当使用密码_verify时,它会显示false。错误报告不返回任何错误。我似乎不明白为什么它不起作用

存储的密码为:$2y$10$pah82g8RHELhYP/MJEGNcuOFeg6u60.NUTigLSxrezhMMCAc7jvSi

用户密码哈希为:$2y$10$gd9GsmfchKKLwPX1jG.6YEVUGZGSLTLG7TFCW3WSKLXBW6GTBXXXE

验证返回:boolfalse

目前,SQL注入并不重要,这纯粹是为了获得正确的验证。这项工作完成后,将担心注射。PHP版本是最新的。数据库是SQL Server T-SQL

编辑1------

<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
//Defining variables
$usernameErr = $passErr = "";
$username = $password = "";

$loginBool = true;

// Error check the username
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    if (empty($_POST["username"])) {
        $usernameErr = "Please enter a Username";
        $loginBool = false;
    } else {
        $username = $_POST["username"];
        if (!preg_match("/^[\w-_+]*$/", $username)) {
            $usernameErr = "Only letters numbers and hyphens allowed";
            $loginBool = false;
        }
        //Setting session variable
        else {
            $_SESSION["User"] = $username;
        }

    }
    //Error checking the password
        if(empty($_POST["password"])) {
            $passErr = "Please Enter a password";
            $loginBool = false;
        } 
        else {
            //Check if password has correct characters
            if (!preg_match("/^[a-zA-Z0-9]*$/", $password)) {
                $passErr = "Password is not in correct format" ;
                $loginBool = false;
            }
            else {
                $hashed_pass = password_hash($password, PASSWORD_BCRYPT);
            }
        }
         //if no errors present, connect to and check user
        if($loginBool == true) {
            $server = 'sql.rde.hull.ac.uk';
            $connectionInfo = array("Database"=>"rde_556278");
            $conn = sqlsrv_connect($server, $connectionInfo);
            $SelectQuery = "SELECT Username FROM Users WHERE Username = ?";

            //Initialize params and prepare statement
            $params = array($username);
            $results = sqlsrv_query($conn, $SelectQuery, $params, array("Scrollable" => "buffered"));
            if($results === false) {
                die (print_r(sqlsrv_errors(), true));
            }
            else {
                while ($row = sqlsrv_fetch_array($results, SQLSRV_FETCH_ASSOC)) {

                    $rowCount = sqlsrv_num_rows($results);
                    if ($rowCount != 1) {

                    }
                    else {
                        $SelectQuery = "SELECT Pass FROM UserInfo WHERE Username = ?";
                         $params = array($username);
                         $results = sqlsrv_query($conn, $SelectQuery, $params, array("Scrollable" => "buffered"));
                        if($results === false) {
                            die (print_r(sqlsrv_errors(), true));
                        }
                        else {
                            while ($row = sqlsrv_fetch_array($results, SQLSRV_FETCH_ASSOC)) {

                                $rowCount = sqlsrv_num_rows($results);
                                $storedPass = $row['Pass'];
                                echo "Stored Password is " . $storedPass . "<br><br>";
                                echo "User password is " . $hashed_pass;
                            }
                            $verification = password_verify($hashed_pass, $storedPass);
                            echo "<br><br>";
                            var_dump($verification);
                        }
                    }
                }
            }
        }
}
?>
根据注释,重新格式化的代码在验证时仍然返回false

编辑2----------

        if($loginBool == true) {
            $server = 'sql.rde.hull.ac.uk';
            $connectionInfo = array("Database"=>"rde_556278");
            $conn = sqlsrv_connect($server, $connectionInfo);
            $SelectQuery = "SELECT Username, Pass FROM UserInfo WHERE Username = ?";

            //Initialize params and prepare statement
            $params = array($username);
            $results = sqlsrv_query($conn, $SelectQuery, $params, array("Scrollable" => "buffered"));
            if($results === false) {
                die (print_r(sqlsrv_errors(), true));
            }
            else {
                while ($row = sqlsrv_fetch_array($results, SQLSRV_FETCH_ASSOC)) {
                    $user = $row['Username'];
                    $PassFromDatabase = $row['Pass'];
                    echo $user . "<br><br>";
                    echo $PassFromDatabase;

                    $rowCount = sqlsrv_num_rows($results);
                    if ($rowCount == 1) {
                        $verified = password_verify($password, $PassFromDatabase);
                        var_dump($verified);
                    }
                }
            }
        }

更改代码以一次性提取所需数据,使其更易于阅读。Bool仍然返回false,正确地从数据库中提取哈希值,用户名也是如此

你删掉输入了吗?您是否通过密码检查输入?是否手动验证?检查WritePhonline.com中的第一个示例功能测试输入是否正在修剪它?至少我认为它是这样做的?测试输入是一团糟。不要用那个。参数化您的查询$loginBool=true是赋值而不是比较^[a-zA-Z0-9-\]*$也可以是^[\w-]*$您可能需要+,尽管$login bool已经修复,并且现在删除了测试输入。目前,我已经说过,在验证工作完成之前,查询不会被参数化,因为这只是一个项目啊,nvm,现在是学习参数化查询的好时机
        if($loginBool == true) {
            $server = 'sql.rde.hull.ac.uk';
            $connectionInfo = array("Database"=>"rde_556278");
            $conn = sqlsrv_connect($server, $connectionInfo);
            $SelectQuery = "SELECT Username, Pass FROM UserInfo WHERE Username = ?";

            //Initialize params and prepare statement
            $params = array($username);
            $results = sqlsrv_query($conn, $SelectQuery, $params, array("Scrollable" => "buffered"));
            if($results === false) {
                die (print_r(sqlsrv_errors(), true));
            }
            else {
                while ($row = sqlsrv_fetch_array($results, SQLSRV_FETCH_ASSOC)) {
                    $user = $row['Username'];
                    $PassFromDatabase = $row['Pass'];
                    echo $user . "<br><br>";
                    echo $PassFromDatabase;

                    $rowCount = sqlsrv_num_rows($results);
                    if ($rowCount == 1) {
                        $verified = password_verify($password, $PassFromDatabase);
                        var_dump($verified);
                    }
                }
            }
        }