Привет Я пытаюсь создать страницу, где мои пользователи могут изменить свой пароль. Когда я ввожу текущий пароль и пытаюсь его изменить, он, похоже, не распознает текущий пароль. Мне было интересно, так это потому, что я использовал md5 и salt1 и salt2 в пароле в другом php-файле?Изменение пароля пользователя через базу данных
Вот мой код, любая помощь и совет будут высоко оценены.
<?php
session_start();
require_once ("connect.php");
require_once 'functions/cleanstring.php';
require_once 'functions/encrypt.php';
$password = clean($db_server, $_POST['password']);
$newpassword = clean($db_server, $_POST['newpassword']);
$repeatnewpassword = clean($db_server, $_POST['repeatnewpassword']);
if ($_POST['submit'] == 'Change') {
if ($password && $newpassword && $repeatnewpassword) {
if ($newpassword == $repeatnewpassword) {
if ($db_server) {
mysqli_select_db($db_server, $db_database);
$password = ($password);
// check whether username exists
$query = "SELECT password FROM users WHERE password='$password' AND username='" . $_SESSION['username'] . "'";
$result = mysqli_query($db_server, $query);
if ($row = mysqli_fetch_array($result)) {
$newpassword = salt($newpassword);
$query = "UPDATE `users` SET `password`='$newpassword' WHERE `username`='" . $_SESSION['username'] . "'";
mysqli_query($db_server, $query) or
die("Insert failed. " . mysqli_error($db_server));
$message = "<strong>You've changed your password!</strong>";
//require_once("db_close.php");
// Process further here
} else {
$message = "Please type the correct current password!";
}
mysqli_free_result($result);
} else {
$message = "Error: could not connect to the database.";
}
//require_once("db_close.php");
} else {
$message = "The new password and the 'Repeat New Password' must match!";
}
} else {
$message = "Fill all fields.";
}
}
?>
<?php
include_once("templates/open.php");
?>
<form action='changepassword.php' method='POST'>
Password: <input type='password' name='password'><br />
New Password: <input type='password' name='newpassword'><br />
Retype New Password: <input type="password" name="repeatnewpassword"><br/>
<input type='submit' name='submit' value='Change'>
<input name='reset' type='reset' value='Reset'>
</form>
<?php echo $message; ?>
<p><a href='login.php'>Go back</a></p>
<?php
require_once 'templates/close.php';
?>
</body>
</html>
Возможно, ваша догадка верна. Если вы храните хэшированные пароли, вам нужно будет хешировать, прежде чем делать выбор. Похоже, что строка с паролем $ password = ($ password) должна использовать соль. $ password = salt ($ password). Однако это все еще выглядит неправильно. Где вы храните соль? Если для каждого пользователя такая же соль, это неэффективно. Соль должна быть сохранена в таблице паролей с хешированным значением пароля, чтобы ее можно было использовать позднее. – RacerNerd
Значение My Salt хранится внутри этого файла php с именем encrypt.php >> Функция шифрования ($ пароль) { \t $ salt1 = "egf"; \t $ salt2 = "7yh"; \t $ password = md5 ($ salt. $ Password. $ Salt2); \t return $ password; } Я создаю админ-сайт, поэтому нужен только один пользователь, поэтому, как сайт с одним пользователем, у меня есть только эта соль. В моей базе данных cPanel у меня есть длинный пароль хеширования md5, показывающий мне .. хешированная версия того, который пользователь вводит на сайт. добавить ли я соль на фронт и конец? извините еще раз и благодарим вас за помощь. – user3178755
Вы должны сделать ту же процедуру как при выборе, так и при сохранении. Поэтому используйте тот же солевой образец. Один из способов отладить это - это напечатать хешированное значение, которое вы используете при выборе на экране перед запуском запроса. Затем вы можете вручную сравнить это значение с таковым в базе данных. Если они не совпадают, возникает проблема при преобразовании в хешированный формат. Если они совпадают, возникает проблема в запросе или в том, как обрабатываются результаты запроса. – RacerNerd