#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()
andpassword_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:
Запрос «ВЫБРАТЬ * из участников, ГДЕ» неверен, соответствующая строка запроса «ВЫБРАТЬ * из участников ….».
Вы должны сделать перерыв между «*» и «от»