Проверка пароля всегда завершается неудачей

#php #sql-server #pdo #password-hash

#php #sql-сервер #pdo #пароль-хэш

Вопрос:

Пароль хэшируется и попадает в базу данных, когда я пытаюсь его проверить, он возвращает false каждый раз, когда я повторяю ввод пароля, и столбец пароля db в базе данных имеет правильный размер

 <?php

require_once('dbconfig.php');

class USER
{   

    private $conn;

    public function __construct()
    {
        $database = new Database();
        $db = $database->dbConnection();
        $this->conn = $db;
    }

    public function runQuery($sql)
    {
        $stmt = $this->conn->prepare($sql);
        return $stmt;
    }

    public function register($uname, $umail, $upass)
    {
        try
        {
            $new_password = password_hash($upass, PASSWORD_DEFAULT);

            $stmt = $this->conn->prepare("INSERT INTO USERS(USERNAME, EMAIL, PASSWORD) VALUES(:uname, :umail, :upass)");

            $stmt->bindparam(":uname", $uname);
            $stmt->bindparam(":umail", $umail);
            $stmt->bindparam(":upass", $new_password);                                        

            $stmt->execute();   

            return $stmt;   
        }
        catch(PDOException $e)
        {
            echo $e->getMessage();
        }               
    }


    public function doLogin($uname, $umail, $upass)
    {
        try
        {
            $stmt = "SELECT USERID, USERNAME, EMAIL, PASSWORD, FIRSTNAME FROM USERS WHERE USERNAME = :uname OR EMAIL = :umail ";
            $stmt = $this->conn->prepare($stmt, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
            $stmt->bindparam(':uname', $uname);
            $stmt->bindparam(':umail', $umail);
            $stmt->execute();
            $userRow = $stmt->fetch(PDO::FETCH_ASSOC);
            $db_password = $userRow['PASSWORD'];

            $sql = "SELECT COUNT(*) FROM USERS WHERE USERNAME = :uname OR EMAIL = :umail";
            $sql = $this->conn->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
            $sql->bindparam(':uname', $uname);
            $sql->bindparam(':umail', $umail);
            $sql->Execute();
            $row = $sql->fetch(PDO::FETCH_ASSOC);
            if($row == 1)
            {
                if(password_verify($upass, $userRow['PASSWORD']))
                {
                    $_SESSION['USER_SESSION'] = $userRow['USERID'];
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }
        catch(PDOException $e)
        {
            echo $e->getMessage();
        }
    }

    public function is_loggedin()
    {
        if(isset($_SESSION['USER_SESSION']))
        {
            return true;
        }
    }

    public function redirect($url)
    {
        header("Location: $url");
    }

    public function doLogout()
    {
        session_destroy();
        unset($_SESSION['USER_SESSION']);
        return true;
    }
}
?>
  

редактировать в код я добавил весь класс user, но он по-прежнему возвращает false пароль в БД выглядит так: $ 2y $ 10 $ 16aMCo14n.QyON8dFsaFL..6Fi92LuBdWMCI3eAv3WHKJTblJKQ6q столбцу в БД присвоено значение nvarchar (255), а не null.

Комментарии:

1. Поле пароля, которое вы возвращаете из базы данных, также хэшировано? Используете ли вы password_hash ?

2. Я ввел password_has при регистрации, нужно ли также входить в систему, я все еще новичок в этом

3. проверьте пароль, сохраненный с паролем в базе данных? проверьте также длину, может быть, длина столбца в базе данных короткая, и он не сохраняет весь пароль

4. $row <> 1, там действительно есть ИСТИННОЕ совпадение .. но без третьего = это должно быть нормально. var_dump(password_verify($upass, $userRow['PASSWORD'])) является ложным? Вставьте нового пользователя, введите пароль в insert затем запустите это и отладьте возвращенный проход. Они также одинаковы?

5. Где вы устанавливаете значение $upass ?