Валидация пары логин/пароль. Как решить?

Логин/пароль админа, хранятся в бд, в таблице admin. Есть скрипт валидации, который проверяет их на корректность при входе в «админку». Не соображу, как передать данные из бд и предоставить для проверки валидатору. Вот такой скрипт:

public function loginValidate()
{
    $params = [
        'login' => $admin['login'],
        'password' => $admin['password'],
    ];

    $admin = $this->db->all('SELECT * FROM `admin` WHERE login = :login AND password = :password', $params);
    
    /*Это я глядел чего в переменных хранится
    echo 'POST '; print_r($_POST);
    echo '<br />';
    echo 'admin '; print_r($admin);
    echo '<br />';
    echo 'admin '; print_r($admin['login']);
    echo '<br />';
    echo 'admin '; print_r($admin['password']);
    echo '<br />';*/

    if ($admin['login'] != $_POST['login'] or $admin['password'] != $_POST['password']) {
        $this->error = 'Login incorrect!';
        return false;
    }
    
    return true;
}

Такой вот вывод:

 Notice: Undefined variable: admin in /models/AdminModel.php on line 28
 Notice: Trying to access array offset on value of type null in /models/AdminModel.php on line 28
 Notice: Undefined variable: admin in /models/AdminModel.php on line 29
 Notice: Trying to access array offset on value of type null /home/max/www/test/application/models/AdminModel.php on line 29
 Notice: Undefined index: login in /models/AdminModel.php on line 42
 {"status":"error","message":"Login incorrect!"}

Это результат при нарочито некорректных введённых логине/пароле.

Вопрос решил так:

public function loginValidate()
{
    $password = $this->db->col('SELECT * FROM `admin`');
    
    if (!password_verify($_POST['password'], $password)) {
        $this->error = 'Login incorrect!';
        return false;
    }
    
    return true;
}

Ответы (1 шт):

Автор решения: Егор Банин

Для решения многих задач бывает полезно написать алгоритм в псевдокоде или хотя бы просто списком:

- получить логин, переданный пользователем
- выбрать из бд запись, соответствующую этому логину (where login = :login)
- если запись не найдена, то пользователь ввёл неверный логин
- иначе получить пароль, переданный пользователем, и сравнить его с паролем полученным из бд
- если пароли совпадают, то это админ
- иначе пользователь ввёл неверный пароль

Как видите, всё просто и логично. Осталось только реализовать это. Думаю вы справитесь.

Теперь другой момент. Хранить пароль в бд небезопасно. Это как записвывать пароль на бумажке. Если кто-нибудь получит доступ к базе, то узнает пароли и сможет ими незаметно пользоваться. Лучше хранить в базе хэши от паролей.

Для вычисления хэша пароля в php есть специальная функция password_hash. Перед сохранением пароля в бд применяйте к паролю password_hash, а при проверке пароля применяйте password_verify.

$admin = $this->db->all(...);
...
$password = $_POST['password']?? '';
if (password_verify($password, $admin['password'])) {
    // пользователь ввёл верный пароль
}
→ Ссылка