password_verify возвращает false. не могу найти ошибку

Я пытался понять эту проблему в течение приблизительно 2 месяцев и не могу понять это. У меня есть база данных, которая возвращает хешированный пароль. Я могу подтвердить эту работу из-за распечатки всей информации. Он может вернуть нехешированный и хешированный пароль совершенно нормально, но когда он проверяет пароль, он всегда возвращает false.

Я не уверен что делать. Это может быть что-то действительно легкое, но я, кажется, не могу найти это.

<?php
session_start();
$dbip = "localhost";
$dbuser = "root";
$dbpass = "";
$dbname = "projectNitro";
$conn = new mysqli($dbip, $dbuser, $dbpass, $dbname);

if($conn->connect_error) {
echo("Connection failed: " . $conn->connect_error);
}

$password = mysqli_real_escape_string($conn, $_GET["pass"]);
$email = mysqli_real_escape_string($conn, $_GET["email"]);
$sql = "SELECT * FROM users WHERE email='{$email}' LIMIT 1";
$query = mysqli_query($conn, $sql);
$pass = $_GET["pass"];

if($query == TRUE) {
$row = mysqli_fetch_array($query);
$db_password = $row['password'];
$db_usertype = $row['accountType'];
$username = $row['username'];
echo $password;
echo "<br>";
echo $db_password;
echo "<br>";
$verify = password_verify($pass, $db_password);

if($verify) {
$_SESSION['username'] = $username;
$_SESSION['at'] = $db_usertype;
header("Location: http://website.com");
} else {
echo("DB Email: ".$row["email"]
."<br>Username: ".$row["username"]
."<br>DB Password: ".$row["password"]
."<br>AccountType: ".$row["accountType"]
."<br>Inserted Email: ".$_GET["email"]
."<br>Inserted Password: ".$_GET["pass"]."<br>");

if(password_verify($_GET["pass"], $row["password"])) {
echo("epic<br>");
} else {
echo("not epic<br>");
}
}
} else {
header("Location: http://website.com");
}
$conn->close();
?>

0

Решение

Вы должны сделать детские шаги. продолжайте наращивать, пока это работает.

Вот более простая версия вашего кода, которая должна работать с образцом пароля из официального документа: http://php.net/manual/en/function.password-verify.php

Также используйте die(); отлаживать ваш код в каждом {} блок.
В вашем текущем коде вы перенаправляете на веб-сайт в обоих случаях очень трудно отследить, что не так, если вы перенаправлены!

У вас есть бесполезные и неясные переменные, например $dbpass, $db_password очень неоднозначно, даже если мы с вами понимаем, что это невозможно отремонтировать. Как и ваш стиль кодирования, вам нужно сделать отступ!

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

<?php

session_start();
$dbip = "localhost";
$dbuser = "root";
$dbpass = "";
$dbname = "projectNitro";
$conn = new mysqli($dbip, $dbuser, $dbpass, $dbname);

if ($conn->connect_error){
echo("Connection failed: " . $conn->connect_error) . '<br><br>';
}

$password = 'rasmuslerdorf';//mysqli_real_escape_string($conn, $_GET["pass"]);
// $email = mysqli_real_escape_string($conn, $_GET["email"]);
// $sql = "SELECT * FROM users WHERE email='{$email}' LIMIT 1";
// $query = mysqli_query($conn, $sql);
// $pass = $_GET["pass"];

// if ($query == TRUE) {
// $row = mysqli_fetch_array($query);
$db_password = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';
// $username = $row['username'];

echo $password;
echo "<br>";
echo $db_password;
echo "<br>";

if (password_verify($password, $db_password)) {
die('ok');
} else {
die('not ok');
}
// } else {
//   header("Location: http://website.com");
// }

$conn->close();
?>

Здесь я немного изменил и добавил несколько комментариев вдоль кода, чтобы помочь вам понять подход.

<?php

session_start();

// This array is used only like a simple namespace.
$dbCredentials = [
'host' => "localhost",
'user' => "root",
'password' => "",
'dbname' => "projectNitro"];
$dbConn = new mysqli($dbCredentials['host'], $dbCredentials['user'], $dbCredentials['password'], $dbCredentials['dbname']);

if ($dbConn->connect_error) {
// Should not continue script if can't connect to DB.
die("Connection failed: " . $dbConn->dbConnect_error);
}

// You should check the existence of $_GET["pass"] before using it, with empty() or isset().
$passwordToCheck = mysqli_real_escape_string($dbConn, $_GET["pass"]);// Renamed var more meaningful.
$userEmail = mysqli_real_escape_string($dbConn, $_GET["email"]);
$sql = "SELECT * FROM users WHERE email='{$userEmail}' LIMIT 1";// Don't select * if you don't need everything.
$query = mysqli_query($dbConn, $sql);
$pass = $_GET["pass"];// you already have $passwordToCheck.

if ($query) {// Don't need == TRUE
// $row = mysqli_fetch_array($query);
$db_password = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';
$username = $row['username'];

echo "$passwordToCheck<br>$db_password<br>";// This is way less verbose than repeating echo and uses less echo functions.

if (password_verify($passwordToCheck, $db_password)) {// Don't need to keep this condition in a variable.
die('ok');// this is just an example to test.
} else {
die('not ok');// this is just an example to test.
}
} else {
header("Location: http://website.com");// While debugging don't redirect, put die('message');
}

$dbConn->close();
?>
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector