Валидация пары логин/пароль. Как решить?
Логин/пароль админа, хранятся в бд, в таблице 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'])) {
// пользователь ввёл верный пароль
}