Система входа [php + mysql]

0

Я пытаюсь "сравнить" пароль БД с паролем, введенным в форму 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/');
}

Вывод заключается в том, что зарегистрированный пользователь может получить доступ к платформе, даже с неправильным паролем! Как я могу исправить?

  • 4
    Это уязвимо для внедрения SQL, пожалуйста, прочитайте о параметризованных запросах. Кроме того, вы передаете хэш пароля в качестве второго аргумента в password_verify , а не в запрос. Сначала выполните запрос, и фильтруйте только по имени пользователя.
  • 1
    Для здравого смысла старайтесь не называть переменные с crypt в них при работе с hashed контентом.
Показать ещё 4 комментария
Теги:
passwords
php-password-hash

2 ответа

1

Вы ошибаетесь, когда пытаетесь получить пароль, который на самом деле "хэшируется" в 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>);

Это даст вам знать, правильно ли пользователь/пароль или нет.

  • 0
    Я вставил строку: ВЫБЕРИТЕ Senha ОТ usuarios ГДЕ Login = '$ login' LIMIT 1; но по отношению к коду: password_verify ($ senha, <result-senha-from-db>); термин "результат-senha-from-db" будет хешем, записанным в БД? Спасибо за ответы!
  • 0
    Я немного растерялся с этим аргументом === >>> result-senha-from-db
Показать ещё 1 комментарий
0

Мне уже удалось решить проблему !!!

$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/');
}

Я взял советы от вас и присоединился к другим советам с этого форума! Я собрал все, и это сработало !!! Спасибо вам всем!!!

  • 0
    Хорошо, добро пожаловать. Да, у вас есть это прямо сейчас. Помните, что вы ищете только один результат, поэтому while () не является обязательным. Вы можете пойти и посмотреть прямо с $linha = mysqli_fetch_array($sql_auth_consulta)
  • 1
    MarkSkayff, действительно "while ()" не нужно! Я уже удалил его и продолжаю работать очень хорошо !!! Спасибо еще раз !!!
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню