Я застрял со сбросом пароля в php. Я использую password_hash для регистрации, password_verify для входа в систему, все, казалось, работало, пока мне не пришла в голову идея реализовать сброс пароля. Мой план состоял в том, чтобы иметь, конечно, 3 поля: oldPassword, newPassword, confirmNewPassword.
Сначала я проверяю, находится ли старый пароль в БД, если да, то после проверки правильности двух новых паролей обновляю в БД новый пароль. Проблема в том, что я могу обновить в своей базе данных новый хешированный пароль, но когда я снова вхожу в систему, он не может распознать пароль и не может войти в систему. И я действительно не могу понять, почему.
Вот мой код:
Для регистрации (может и бесполезно, но все же)
if ($_POST['actiune'] == 'register') {
$firstname = $_POST['firstName'];
$lastname = $_POST['lastName'];
$email = $_POST['email'];
$_SESSION['username'] = $email;
$password = $_POST['password'];
$hash = password_hash($password, PASSWORD_BCRYPT);
$age = $_POST['age'];
$address = $_POST['address'];
if(addUser($firstname, $lastname, $email, $hash, $age, $address)) {
header("Location: index.php?page=profile");
}
else
die("User didnt add in db.");
}
авторизоваться:
if($_POST['actiune'] == 'login') {
$email = $_POST['email'];
$password = $_POST['password'];
$pass = getPassword($email);
$verify = password_verify($password, $pass);
if ($verify) {
$_SESSION['username'] = $email;
header("Location: index.php?page=profile");
} else {
header("Location: index.php?page=login&msg=PleaseRegister");
die();
}
}
сбросить пароль:
if($_POST['actiune'] == 'resetPassword') {
$oldPassword = $_POST['oldPassword'];
$newPassword = $_POST['newPassword'];
$confirmPassword = $_POST["confirmPassword"];
$passwordDb = getPassword($_SESSION['username']);
$verify = password_verify($oldPassword, $passwordDb);
if($verify) {
setPassword($newPassword, $_SESSION['username']);
header("location: index.php?page=profile");
}
}
функция setPassword
function setPassword($password, $email) {
include("connectionFile.php");
$hash = password_hash($password, PASSWORD_BCRYPT);
try {
$sql = $conn->prepare("update user set password = '$hash' where email='$email'");
$sql->execute();
} catch(Exception $e) {
echo $e->getMessage();
return false;
}
return true;
}
Функция getPassword, используемая для входа в систему:
function getPassword($email) {
include("connectionFile.php");
$sql = $conn->prepare("select * from user where email='$email'");
$sql->execute();
$result = $sql;
foreach($result as $row) {
$pass= $row['password'];
}
return $pass;
}
setPassword($newPassword,
, но затем используете$password
в двух экземплярах вашей функцииsetPassword()
. Убедитесь, что в конце нового пароля нет пробелов и что все столбцы, связанные с паролем, имеют достаточную длину для хранения всех хэшей (60+). Кроме этого, я не знаю, почему ваш сброс/вход не работает. Убедитесь также, что массив сеансов все еще установлен и для того же пользователя. Это, вероятно, тихо терпит неудачу, так как что-то хеширует, но что? Посмотрите, что также показываетvar_dump()
. - person Funk Forty Niner   schedule 30.12.2016prepare
не является подготовленным оператором, оно допустимо сexecute()
, но их можно сузить до простогоquery()
. Это руководство для подготовленных операторов в mysqli_ php.net/manual/en/mysqli.prepare .php - person Funk Forty Niner   schedule 30.12.2016