petushok55
@petushok55
Обучаюсь на практике.

Не работает авторизация password_hash PHP 7.4?

/* регистрация */
        $ps= filter($_GET['password']);
        $ps_hash= password_hash($ps, PASSWORD_DEFAULT);
# беру пароль, хеширую, добавляю в бд
          qry("INSERT INTO `pidors` SET `login` = ?, `password` = ?",  array($login,$ps_hash));
# в бд добавляется. всё нормально.

/* авторизация */
        $password = filter($_GET['password']);
        $pw_hash = qry("SELECT `password` FROM `pidors` WHERE `login` = ? LIMIT 1", array($login));
#взял хэш пароля введённого логина, теперь сверяю пароль
        if(password_verify($password, $pw_hash)){
          $sql = acc("SELECT * FROM `pidors` WHERE `login` = ? AND `password` = ? LIMIT 1", array($login,$pw_hash));
        }

Алгоритм правильный? В чём яма?
  • Вопрос задан
  • 205 просмотров
Пригласить эксперта
Ответы на вопрос 1
@khalmurad
PHP dev
У меня есть простой класс для этой задачи. Попробуйте.

Специальный класс Database для подключения к базе данных.

Database.php
class Database
{
    private $db;
    private static $staticConnect = null;

    private $dbHost = "localhost";
    private $dbUsername = "username";
    private $dbPassword = "password";
    private $dbName = "db";
    private $dbCharset = "utf8";

    private function __construct()
    {
        $this->db = new PDO(
			"mysql:host={$this->dbHost};
			dbname={$this->dbName};
			charset={$this->dbCharset}", 
			$this->dbUsername, 
			$this->dbPassword
		);
    }

    public static function getStaticConnect()
    {
        if (!self::$staticConnect)
        {
            self::$staticConnect = new Database();
        }

        return self::$staticConnect;
    }

    public function Connection()
    {
        return $this->db;
    }
}


Специальный класс Users для вашей задачи.

Users.php
include_once "Database.php";

class Users
{
    private $db;
    const TABLE_NAME = "users";

    public function __construct()
    {
        $staticConnect = Database::getStaticConnect();
        $this->db = $staticConnect->Connection();
    }
	
    public function createUser($data)
    {
        $username = $data['username'];
        $password = password_hash($data['password'], PASSWORD_DEFAULT);

        $sql = "INSERT INTO ".self::TABLE_NAME." (username, password) VALUES(:username, :password)";
	$params = [
    		':username' => $username,
		':password' => $password
	];
        $stmt = $this->db->prepare($sql);
	$stmt->execute($params);

	/**
	* Вы можете отобразить это сообщение, 
	* открыв session на странице users.
	**/
        $_SESSION['success'] = "Username and Password created successfully!";
        header('Location: users');
    }

    public function Login($data)
    {
        $username = $data['username'];
        $password = $data['password'];

        $sql = "SELECT username, password FROM ".self::TABLE_NAME." WHERE username = :username";
        $getUser = $this->db->prepare($sql);
        $getUser->bindParam(':username', $username);
        $getUser->execute();
        $rows = $getUser->fetch(PDO::FETCH_LAZY);

        if (empty($username) && empty($password))
        {
	    /**
	    * Вы можете отобразить это сообщение, 
	    * открыв session на странице входа.
	    **/
            $_SESSION['failed'] = "Username and Password can not be blank!";
        }
        elseif ($username == $rows['username'] && password_verify($password, $rows['password']))
        {
	    $this->setAuthSession();
            header('Location: admin');
        else
        {
	    /**
	    * Вы можете отобразить это сообщение, 
	    * открыв session на странице входа.
	    **/
            $_SESSION['failed'] = "Username or Password incorrect!";
	}
    }
	
    public function Logout()
    {
        session_destroy();
        header("Location: login");
        exit;
    }
	
    private function setAuthSession()
    {
	/**
	* Мы добавляем auth в session, 
	* чтобы убедиться, что пользователь 
	* вошел в систему.
	**/
        $_SESSION['auth'] = true;
    }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы