Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP: базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
Gregory_N
2 / 1 / 1
Регистрация: 22.11.2019
Сообщений: 13
1

Не работает password_verify

03.12.2019, 17:34. Просмотров 908. Ответов 9

Доброго времени суток. В коде есть функция для проверки хеш-суммы (password_verify), при взятии хеш-суммы из БД и проверки её скриптом выдает отрицательный вариант проверки. Подскажите мне, колдуну, неопытном, как можно решить данную проблему.
Код страницы логина
Кликните здесь для просмотра всего текста

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<!DOCTYPE HTML>
<?php require_once("includes/connection.php"); ?>
<?php session_start(); ?>
 
    <?php require_once("includes/connection.php"); ?>
    <?php include("includes/header.php"); ?>
    <?php
 
    if(isset($_SESSION["session_username"])){
    header("Location: intropage.php");
    }
 
    if(isset($_POST["login"]))
 
    if(!empty($_POST['username']) && !empty($_POST['password'])) {
    $username=htmlspecialchars($_POST['username']);
    $password=htmlspecialchars($_POST['password']);
    $query=mysqli_query($link, "SELECT * FROM usertb WHERE username='".$username."' AND passhash='".$passhash."'");
    if(password_verify($password, $passhash)){
    $numrows=mysqli_num_rows($query);
    if($numrows!=0)
 {
while($row=mysqli_fetch_assoc($query))
 {
    $dbusername=$row['username'];
  $dbpassword=$row['password'];
 }
  if($username == $dbusername && $password == $dbpassword)
 {
     $_SESSION['session_username']=$username;
   header("Location: intropage.php");
 }
 }} else {
    echo  "Invalid username or password!";
 }
 } else {
    $message = "All fields are required!";
 }
 
 ?>
<?php include("includes/header.php"); ?>
 
<html lang="en">
    <body>
        <div class="container mlogin">
        <div id="login">
        <h1>Вход</h1>
        <form action="" id="loginform" method="post" name="loginform">
            <p><label for="user_login">Имя пользователя<br>
            <input class="input" id="username" name="username" size="20"type="text" value=""></label></p>
            <p><label for="user_pass">Пароль<br>
            <input class="input" id="password" name="password" size="20"type="password" value=""></label></p>
            <p class="submit">
            <input class="button" name="login" type="submit" value="Войти"></p>
        </form>
        </div>
        </div>
        <?php include("includes/footer.php"); ?>
    </body>
</html>

Код страницы регистрации, в которой прописана функция хеширования пароля.
Кликните здесь для просмотра всего текста

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<!DOCTYPE HTML>
<html lang="en">
<?php require_once("includes/connection.php"); ?>
<?php
 
    if(isset($_POST["register"])){
 
    if(!empty($_POST['full_name']) && !empty($_POST['username']) && !empty($_POST['password'])) {
 $full_name= htmlspecialchars($_POST['full_name']);
 $username=htmlspecialchars($_POST['username']);
 $password=htmlspecialchars($_POST['password']);
 $passhash=password_hash($password, PASSWORD_DEFAULT);
 $query=mysqli_query($link, "SELECT * FROM usertb WHERE username='".$username."'");
  $numrows=mysqli_num_rows($query);
if($numrows==0)
   {
    $sql="INSERT INTO usertb
  (full_name, username, passhash)
    VALUES('$full_name', '$username', '$passhash')";
  $result=mysqli_query($link, $sql);
 if($result){
    $message = "Account Successfully Created";
} else {
 $message = "Failed to insert data information!";
  }
    } else {
    $message = "That username already exists! Please try another one!";
    }
    } else {
    $message = "All fields are required!";
    }
    }
    ?>
 
<?php if (!empty($message)) {echo "<p class='error'>" . "MESSAGE: ". $message . "</p>";} ?>
<?php include("includes/header.php"); ?>
 
<body>
  <div class="container mregister">
  <div id="login">
    <h1>Регистрация</h1>
    <form action="register.php" id="registerform" method="post" name="registerform">
      <p><label for="user_login">Полное имя<br>
      <input class="input" id="full_name" name="full_name"size="32"  type="text" value=""></label></p>
      <p><label for="user_pass">Имя пользователя<br>
      <input class="input" id="username" name="username"size="20" type="text" value=""></label></p>
      <p><label for="user_pass">Пароль<br>
      <input class="input" id="password" name="password"size="32"   type="password" value=""></label></p>
      <p class="submit"><input class="button" id="register" name= "register" type="submit" value="Зарегистрироваться"></p>
      <p class="regtext">Уже зарегистрированы? <a href= "login.php">Введите имя пользователя</a>!</p>
    </form>
  </div>
  </div>
  <?php include("includes/footer.php"); ?>
</body>
</html>
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.12.2019, 17:34
Ответы с готовыми решениями:

Функция password_verify
Нужно в данный код создать функцию password_verify для проверки кеша, не пойму куда ее вставлять то...

Password_verify Как дешифровать в реальном проекте
Всем доброго времени суток! У меня такая проблема уже несколько дней не могу решить, как в реальном...

Password_verify and password_hash
Добрый день! Есть код: $query = mysql_query(&quot;SELECT id, password FROM users WHERE...

Password_verify multiple
Добрый день, помогите решить одну проблему: Если массив зашифрованных паролей $array = ; и...

Принцип работы password_verify()
Добрый день, уважаемые форумчане! Прошу помощи в связи с недопониманием алгоритма работы функции...

9
sasha0012
853 / 400 / 227
Регистрация: 21.06.2012
Сообщений: 1,458
03.12.2019, 17:42 2
Gregory_N, включите вывод ошибок в пхп, и он сам много чего вам расскажет. Например откуда в выборке (на странице логина) появилось такое условие: AND passhash='".$passhash."' ? Откуда взялся $passhash?

В password_verify нужно передать пароль пользователя и хеш из БД:
PHP
1
if(password_verify($password_user, $passhash_db)){
0
Gregory_N
2 / 1 / 1
Регистрация: 22.11.2019
Сообщений: 13
03.12.2019, 18:40  [ТС] 3
Цитата Сообщение от sasha0012 Посмотреть сообщение
Например откуда в выборке (на странице логина) появилось такое условие: AND passhash='".$passhash."'? Откуда взялся $passhash?
В БД, в таблице есть столбец под названием passhash, откуда собственно и берет хеш-сумму скрипт станицы логина. А $passhash, это переменная которая используется на странице регистрации для хранения в себе, и последующей отправке, хеш-суммы пароля.
0
Gregory_N
2 / 1 / 1
Регистрация: 22.11.2019
Сообщений: 13
03.12.2019, 18:55  [ТС] 4
Структура БД
0
Миниатюры
Не работает password_verify  
03.12.2019, 18:55
sasha0012
853 / 400 / 227
Регистрация: 21.06.2012
Сообщений: 1,458
03.12.2019, 19:01 5
Gregory_N, это всё я понимаю. Но вы не совсем понимаете что происходит на страницы авторизации. Авторизация и регистрация это два отдельных скрипта. Соответственно и обработка данных должна отличаться.

В вашем коде (для авторизации), это:
PHP
1
2
$query=mysqli_query($link, "SELECT * FROM usertb WHERE username='".$username."' AND passhash='".$passhash."'");
if(password_verify($password, $passhash)){
поменяйте на это:
PHP
1
2
3
$query=mysqli_query($link, "SELECT * FROM usertb WHERE username='".$username."'");
$row=mysqli_fetch_assoc($query)
if(password_verify($password, $row['passhash'])){
и вникайте почему именно так должно быть!
0
Gregory_N
2 / 1 / 1
Регистрация: 22.11.2019
Сообщений: 13
03.12.2019, 19:10  [ТС] 6
Цитата Сообщение от sasha0012 Посмотреть сообщение
поменяйте на это:
Поменял, но после введения правильного логина и пароля должен происходить редирект на страницу intropage.php, а в данном случае ничего не происходит кроме того, что на странице перестало писать строку "Invalid username or password!"
0
sasha0012
853 / 400 / 227
Регистрация: 21.06.2012
Сообщений: 1,458
03.12.2019, 19:29 7
Лучший ответ Сообщение было отмечено Gregory_N как решение

Решение

ага, то есть вы даже не хотите вникать в суть происходящего. Ну я конечно могу написать итоговый вариант:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if(!empty($_POST['username']) && !empty($_POST['password'])) {
    
    $username=htmlspecialchars($_POST['username']);
    $password=htmlspecialchars($_POST['password']);
    $query=mysqli_query($link, "SELECT * FROM usertb WHERE username='$username'");
    $row=mysqli_fetch_assoc($query);
    
    if(!$row['passhash'] OR password_verify($password, $row['passhash'])!==true){
        echo  "Invalid username or password!";
    }elseif(password_verify($password, $row['passhash'])===true){
        $_SESSION['session_username']=$username;
        header("Location: intropage.php");
    }
 
} else {
    $message = "All fields are required!";
}
но таким подходом, вы в программировании далеко не продвинетесь.
1
Gregory_N
2 / 1 / 1
Регистрация: 22.11.2019
Сообщений: 13
03.12.2019, 19:52  [ТС] 8
Цитата Сообщение от sasha0012 Посмотреть сообщение
ага, то есть вы даже не хотите вникать в суть происходящего.
Можете, пожалуйста, пояснить в чём разница между моей версией кода и той что вы скинули.

Добавлено через 2 минуты
Как конкретно работает этот участок кода:
PHP
1
2
3
4
5
6
7
8
    $row=mysqli_fetch_assoc($query);
    
    if(!$row['passhash'] OR password_verify($password, $row['passhash'])!==true){
        echo  "Invalid username or password!";
    }elseif(password_verify($password, $row['passhash'])===true){
        $_SESSION['session_username']=$username;
        header("Location: intropage.php");
    }
0
sasha0012
853 / 400 / 227
Регистрация: 21.06.2012
Сообщений: 1,458
03.12.2019, 21:28 9
Цитата Сообщение от Gregory_N Посмотреть сообщение
Как конкретно работает этот участок кода
PHP
1
2
3
4
5
6
7
8
9
    
    $row=mysqli_fetch_assoc($query); // обрабатываем и записываем в массив результат выборки из БД. Можно посмотреть что находится в переменной $row: var_dump($row);
    
    if(!$row['passhash'] OR password_verify($password, $row['passhash'])!==true){ // если мы не нашли хеш пароля пользователя в БД (нет $row['passhash']) или если нашли но при этом проверка введённого пароля не соответствует хешу из БД (пароль введён неверно), то выводим предупреждение. Эту проверку можно разделить на две отдельные, чтобы чётко понимать в чём именно дело.
        echo  "Invalid username or password!";
    }elseif(password_verify($password, $row['passhash'])===true){ // если пароль введён правильно (хеш функция password_verify проверила введённый пароль с хешем и вернула true), то авторизуем пользователя.
        $_SESSION['session_username']=$username;
        header("Location: intropage.php");
    }
основная суть в том что мы выбираем из базы только по логину, а пароль проверяем потом.
0
Gregory_N
2 / 1 / 1
Регистрация: 22.11.2019
Сообщений: 13
03.12.2019, 21:59  [ТС] 10
sasha0012, спасибо вам за помощь, а также за чёткое и понятное объяснение кода и как правильно надо всё это писать. Пойду дальше php изучать =)
0
03.12.2019, 21:59
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2019, 21:59

Проверка с использованием password_verify
Делал я авторизацию и возникла необходимость проверить захэшированный пароль, лежащий в текстовом...

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.