Я пытаюсь "сравнить" пароль БД с паролем, введенным в форму html, но он не работает!
Сначала хеш пароля (register.php
) был создан с помощью "password_hash". кстати, отлично работаю !!!
$conexao = new mysqli($servername, $username, $password, $dbname);
$login = isset($_POST['Login']) ? $_POST['Login'] : '';
$senha = isset($_POST['Senha']) ? $_POST['Senha'] : '';
$crypt_senha = password_hash($senha, PASSWORD_DEFAULT, ['cost' => 18]);
$sql_insert = "INSERT INTO usuarios (Login, Senha) VALUES ('$login','$crypt_senha')";
$conexao -> query($sql_insert) === 0;
echo '<script type = "text/javascript" > alert("data entered successfully!!!") </script>';
Проблема заключается в файле "login.php". не "конвертирует" пароль, введенный с паролем, который находится в БД!
$conexao = new mysqli($servername, $username, $password, $dbname);
$login = isset($_POST['Login']) ? $_POST['Login'] : '';
$senha = isset($_POST['Senha']) ? $_POST['Senha'] : '';
$sql_auth = "SELECT Login, Senha FROM usuarios where Login = '$login' AND Senha = '$senha'";
$decrypt_senha_DB = password_verify($senha, $sql_auth);
$resultado_auth = $conexao -> query($decrypt_senha_DB);
if ($resultado_auth -> num_rows === 0) {
echo '<script type = "text/javascript" > alert("Incorrect user and/or password!") </script>';
exit();
}
else {
header('location: https://www.google.com.br/');
}
Вывод заключается в том, что зарегистрированный пользователь может получить доступ к платформе, даже с неправильным паролем! Как я могу исправить?
Вы ошибаетесь, когда пытаетесь получить пароль, который на самом деле "хэшируется" в db.
$sql_auth = "SELECT Login, Senha FROM usuarios where Login = '$login' AND Senha = '$senha'";
Сена выше не может работать, потому что хэшируется.
Вам нужно просто запустить SELECT только с информацией USER. Принесите этого пользователя. И с тем, что возвращается от этого пользователя, вы сравниваете пароль с функцией php password_verify()
.
Это означает что-то вроде: SELECT Senha FROM usuarios WHERE Login='$login' LIMIT 1;
Затем вы выполняете password_verify($senha, <result-senha-from-db>);
Это даст вам знать, правильно ли пользователь/пароль или нет.
Мне уже удалось решить проблему !!!
$conexao = new mysqli($servername, $username, $password, $dbname);
$login = isset($_POST['Login']) ? $_POST['Login'] : '';
$senha = isset($_POST['Senha']) ? $_POST['Senha'] : '';
$sql_auth = "SELECT Senha FROM usuarios where Login = '$login'";
$sql_auth_consulta = mysqli_query($conexao,$sql_auth);
while ($linha = mysqli_fetch_array($sql_auth_consulta)){
$hash_DB = $linha['Senha'];
$decrypt_password = password_verify($senha, $hash_DB);
}
if($decrypt_password <> TRUE){
echo '<script type = "text/javascript" > alert("Incorrect user and/or password") </script>';
exit();
}
else {
header('location: https://www.google.com.br/');
}
Я взял советы от вас и присоединился к другим советам с этого форума! Я собрал все, и это сработало !!! Спасибо вам всем!!!
$linha = mysqli_fetch_array($sql_auth_consulta)
password_verify
, а не в запрос. Сначала выполните запрос, и фильтруйте только по имени пользователя.crypt
в них при работе сhashed
контентом.