Обновление пароля SQL с паролем по умолчанию ha sh предотвращает вход в систему - PullRequest
0 голосов
/ 05 января 2020

Я следовал этому руководству , чтобы создать систему входа в систему для моего сайта, которая до сих пор работала нормально. Я точно следовал инструкциям, создав все необходимые файлы и т. Д. c. Пользователи, выполнив вход в систему под своим именем, могут без проблем изменить свой пароль.

Однако теперь я создал защищенный каталог, который позволяет другим пользователям сбрасывать пароли других пользователей (если они забыли). их). Этот код ниже:

(я включил весь код для этой страницы, за исключением некоторых моих элементов оформления (например, строка меню, которая находится над остальной частью этого кода). Хотя я понимаю, что это не может будь лучшим способом, я хотел, чтобы я давал тебе как можно больше информации.)

<?php
// Initialize the session
session_start();
 
// Check if user is logged in. If N, return to /login/
if(!isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] !== true){
    header("location: /login/");
    exit;
} ?>



<!DOCTYPE html>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>DAT Room Bookings</title>
<meta name="viewport" content="width=device-width, initial-scale=1"> <!-- Scales to mobile -->
<link rel="stylesheet" type="text/css" href="style.css"> <!-- System style -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"> <!-- Icons -->
<link href="https://fonts.googleapis.com/css?family=Lato&display=swap" rel="stylesheet"> <!-- System font -->
<link rel="stylesheet" href="scripts/lightbox2-2.11.1/src/css/lightbox.css" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script> <!-- Drop Down Images -->
<script src="scripts/lightbox2-2.11.1/src/js/lightbox.js"></script> <!-- Lightbox Images -->
</head>
<?php

/*

EDIT.PHP

Allows user to edit specific entry in database

*/

// creates the edit record form

// since this form is used multiple times in this file, I have made it a function that is easily reusable

function renderForm($id, $username, $password, $error)

{

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<html>

<head>

<title>Edit Record</title>

</head>

<body>

<?php

// if there are any errors, display them

if ($error != '')

{

echo '<div style="padding:4px; border:1px solid red; color:red;">'.$error.'</div>';

}

?>


<form action="" method="post">

<input type="hidden" name="id" value="<?php echo $id; ?>"/>

<div style="padding-left:25%; padding-right:25%; padding-top:10px">

<p><strong>User ID:</strong> <?php echo $id; ?></p>

<strong>Username:</strong> <input type="text" name="username" value="<?php echo $username; ?>" readonly /><br/>

<strong>Enter New Password: *</strong> <input type="text" name="password" value=""/><br/>

<p>* Required</p>

<input type="submit" name="submit" value="Submit">

</div>

</form>

</body>

</html>

<?php

}


// connect to the database

include('connect-db.php');

// check if the form has been submitted. If it has, process the form and save it to the database

if (isset($_POST['submit']))

{

// confirm that the 'id' value is a valid integer before getting the form data

if (is_numeric($_POST['id']))

{

// get form data, making sure it is valid

$id = $_POST['id'];

$username = mysql_real_escape_string(htmlspecialchars($_POST['username']));

$password = mysql_real_escape_string(htmlspecialchars($_POST['password']));

$hashed = password_hash('$password', PASSWORD_DEFAULT);

// check that password fields are both filled in

if ($password == '')

{

// generate error message

$error = 'ERROR: Please fill in all required fields!';


//error, display form

renderForm($id, $username, $password, $error);

}

else

{

// save the data to the database

mysql_query("UPDATE users SET username='$username', password='$hashed' WHERE id='$id'")

or die(mysql_error());


// once saved, redirect back to the view page

header("Location: view.php");

}

}

else

{

// if the 'id' isn't valid, display an error

echo 'Error!';

}

}

else

// if the form hasn't been submitted, get the data from the db and display the form

{


// get the 'id' value from the URL (if it exists), making sure that it is valid (checing that it is numeric/larger than 0)

if (isset($_GET['id']) && is_numeric($_GET['id']) && $_GET['id'] > 0)

{

// query db

$id = $_GET['id'];

$result = mysql_query("SELECT * FROM users WHERE id=$id")

or die(mysql_error());

$row = mysql_fetch_array($result);



// check that the 'id' matches up with a row in the databse

if($row)

{


// get data from db

$username = $row['username'];

$password = $row['password'];


// show form

renderForm($id, $username, $password, '');

}

else

// if no match, display result

{

echo "No results!";

}

}

else

// if the 'id' in the URL isn't valid, or if there is no 'id' value, display an error

{

echo 'Error!';

}

}

?>

Форма отображается правильно и просматривает идентификатор и имя пользователя пользователя. Я установил пароль ha sh так же, как вижу его в функции смены пароля моего сайта (используя значения по умолчанию). Когда я пытаюсь сбросить пароль другого пользователя, я вижу в phpmyadmin, что ha sh изменился, что означало бы, что изменения прошли правильно.

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

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

1 Ответ

0 голосов
/ 06 января 2020

Вы сохраняете пароль здесь как

$hashed = password_hash('$password', PASSWORD_DEFAULT);

Вам не нужны одинарные кавычки вокруг $ password здесь. Кроме того, вы уверены, что на странице входа в систему при проверке учетных данных используется аналогичный тип логики c? Может быть похоже на

$user['password'] == password_hash($_POST['password'],PASSWORD_DEFAULT)

, где $ user извлекается из базы данных.

...