Проблема с «Обновить пароль» (сменить пароль)

#php #database #passwords

#php #База данных #пароли

Вопрос:

Я только что создал страницу «Изменить пароль», но она не обновляет пароль в базе данных

Мне неважно, что я набираю, он продолжает говорить «Пароль изменен»

Заранее спасибо за помощь

С уважением, Саймон

 <?php

require_once 'header.php';

session_start();
$con = mysqli_connect('localhost','robinsnest','robinsnest') or die('Unable To connect');
if(count($_POST)>0) {
$result = mysqli_query($con,"SELECT *from members WHERE user='" . $_SESSION["$user"] . "'");
$row=mysqli_fetch_array($result);
if($_POST["currentPass"] == $row["pass"] amp;amp; $_POST["newPass"] == $row["confirmPass"] ) {
mysqli_query($con,"UPDATE members set pass='" . $_POST["newPass"] . "' WHERE user='" . $_SESSION["$user"] . "'");
$message = "Password Changed Sucessfully";
} else{
 $message = "Password is not correct";
}
}



?>



<html>
<div><?php if(isset($message)) { echo $message; } ?></div>
<form method="post" action="" 
Current Password:<br>
<input type="password" name="currentPassword"><span id="currentPass" class="required"></span>
<br>
New Password:<br>
<input type="password" name="newPassword"><span id="newPass" class="required"></span>
<br>
Confirm Password:<br>
<input type="password" name="confirmPassword"><span id="confirmPass" class="required"></span>
<br><br>
<input type="submit" value ="Change Password">
</form>
<br>
<br>
</html>  

Комментарии:

1. При необходимости у меня есть база данных с таблицами, пользователем и паролем

2. Кажется, вы храните пароли в виде обычного текста, поэтому я бы сначала посмотрел на password_hash() and password_verify() .

3. Имена полей вашей формы также не совпадают с именами, которые вы используете $_POST для обработки данных. Вы могли бы отладить это самостоятельно, используя var_dump() .

4. Вы также чрезвычайно уязвимы для SQL-инъекций

5. Честно говоря, здесь много неправильного. Вы храните простые текстовые пароли вместо использования встроенной функции хэширования паролей PHP, вы широко открыты для внедрения SQL, что означает, что ваш SQL-код может быть любым , и вы не проверяете наличие ошибок после выполнения вашего запроса к БД. Какой бы учебник по PHP ни научил вас всему этому, откажитесь от него и найдите другие.

Ответ №1:

Вам необходимо использовать подготовленные инструкции, потому что в настоящее время вы склонны к SQL-инъекциям.

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

 password_hash($passwordEntered, PASSWORD_BCRYPT);
  

Вы также можете добавить дополнительные параметры к хэшированию пароля, если хотите.

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

 password_verify($passwordEntered, $hashFromDatabase);
  

Это должно сработать. Я использую подготовленные инструкции в этом фрагменте кода, но не хэширую пароль. Вам нужно будет заменить весь PHP в session_start() на этот.

 // create new mysqli connection
$con = new mysqli('localhost', 'username', 'password', 'robinsnest');

// check if the sql credentials are valid
if ($con->connect_errno) {
  echo "Failed to connect to MySQL: (" . $con->connect_errno . ") " . $con->connect_error;
}

// prepared statement
$stmt = $con->prepare("SELECT * FROM members WHERE user=? LIMIT 1");

// view all paramters here:
// https://www.php.net/manual/en/mysqli-stmt.bind-param.php
// i is integer
// d is float
// s is string
// b is blob
$stmt->bind_param("s", $_SESSION["$user"]);

// execute
$stmt->execute();

// get the results
$result = $stmt->get_result();

while ($row = $result->fetch_assoc()) {
  if ($_POST["currentPass"] == $row["pass"] amp;amp; $_POST["newPass"] == $row["confirmPass"]) {
    $updateStmt = $con->prepare("UPDATE members SET pass=? WHERE user=?");$stmt->bind_param("s", $_SESSION["$user"]);
    $updateStmt->bind_param("ss", $_POST["newPass"], $_SESSION["$user"]);
    $updateStmt->execute();
    $message = "Password changed successfully!";
  } else {
    $message = "Password is incorrect.";
  }
}
  

Комментарии:

1. OP также необходимо будет исправить неправильные имена полей формы.

2. Я получаю сообщение об ошибке «Вызов функции-члена prepare() при null»

3. @SSC У меня были некоторые переменные, которые были названы неправильно, попробуйте сейчас.

4. Хм, это работает; Я создал файл под названием Password_change.php (с помощью вашего php-скрипта) и подставляется в action=»» (действие»Password_change.php «. Однако ничего не происходит, когда я нажимаю кнопку отправки на странице (php-файл просто открывается на белой странице, немного новичок в php)

5. @SSC Вы рассматривали возможность использования ajax?

Ответ №2:

Поместите свой код в try catch следующим образом :

 try{
    //your code
} catch (Exception $ex) {
    var_dump($ex->getMessage());
}
  

Он сообщит вам, что не так

Ответ №3:

Запрос «ВЫБРАТЬ * из участников, ГДЕ» неверен, соответствующая строка запроса «ВЫБРАТЬ * из участников ….».

Вы должны сделать перерыв между «*» и «от»