Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/25: Рейтинг темы: голосов - 25, средняя оценка - 5.00
3 / 2 / 1
Регистрация: 22.11.2019
Сообщений: 23
Другое

Не работает password_verify

03.12.2019, 17:34. Показов 5508. Ответов 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)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.12.2019, 17:34
Ответы с готовыми решениями:

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

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

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

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

В password_verify нужно передать пароль пользователя и хеш из БД:
PHP
1
if(password_verify($password_user, $passhash_db)){
0
3 / 2 / 1
Регистрация: 22.11.2019
Сообщений: 23
03.12.2019, 18:40  [ТС]
Цитата Сообщение от sasha0012 Посмотреть сообщение
Например откуда в выборке (на странице логина) появилось такое условие: AND passhash='".$passhash."'? Откуда взялся $passhash?
В БД, в таблице есть столбец под названием passhash, откуда собственно и берет хеш-сумму скрипт станицы логина. А $passhash, это переменная которая используется на странице регистрации для хранения в себе, и последующей отправке, хеш-суммы пароля.
0
3 / 2 / 1
Регистрация: 22.11.2019
Сообщений: 23
03.12.2019, 18:55  [ТС]
Структура БД
Миниатюры
Не работает password_verify  
0
1152 / 554 / 320
Регистрация: 21.06.2012
Сообщений: 1,854
03.12.2019, 19:01
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
3 / 2 / 1
Регистрация: 22.11.2019
Сообщений: 23
03.12.2019, 19:10  [ТС]
Цитата Сообщение от sasha0012 Посмотреть сообщение
поменяйте на это:
Поменял, но после введения правильного логина и пароля должен происходить редирект на страницу intropage.php, а в данном случае ничего не происходит кроме того, что на странице перестало писать строку "Invalid username or password!"
0
1152 / 554 / 320
Регистрация: 21.06.2012
Сообщений: 1,854
03.12.2019, 19:29
Лучший ответ Сообщение было отмечено 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
3 / 2 / 1
Регистрация: 22.11.2019
Сообщений: 23
03.12.2019, 19:52  [ТС]
Цитата Сообщение от 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
1152 / 554 / 320
Регистрация: 21.06.2012
Сообщений: 1,854
03.12.2019, 21:28
Цитата Сообщение от 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
3 / 2 / 1
Регистрация: 22.11.2019
Сообщений: 23
03.12.2019, 21:59  [ТС]
sasha0012, спасибо вам за помощь, а также за чёткое и понятное объяснение кода и как правильно надо всё это писать. Пойду дальше php изучать =)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.12.2019, 21:59
Помогаю со студенческими работами здесь

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

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

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

Password_verify возвращает false, хотя данные корректны
Здравствуйте, при использовании password_verify получаю false, параметры при этом передаю верные. Из-за чего это и как исправить? Вот...

Приложение работает в Debug, странно работает в Release и не работает при билде
Действия выполняются на эмуляторе Pixel 2. Android 9.0. Если я запускаю приложение с конфигурацией Debug, то всё в порядке. При запуске же...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru