ฉันติดอยู่กับการรีเซ็ตรหัสผ่านใน php ฉันใช้password_hashสำหรับการลงทะเบียน,password_verifyสำหรับการเข้าสู่ระบบ ทุกอย่างดูเหมือนจะทำงานได้จนกว่าฉันจะมีความคิดที่จะใช้การรีเซ็ตรหัสผ่าน แผนของฉันคือต้องมี 3 ช่อง:oldPassword, newPassword,confirmNewPassword
ก่อนอื่นฉันตรวจสอบว่า oldPassword อยู่ใน db หรือไม่ ถ้าใช่หลังจากตรวจสอบว่ารหัสผ่านใหม่ 2 รหัสนั้นถูกต้องหรือไม่ เพื่ออัปเดตใน db the newPassword ปัญหาคือฉันสามารถอัปเดตรหัสผ่านที่แฮชใหม่ใน db ของฉันได้ แต่เมื่อฉันเข้าสู่ระบบอีกครั้ง ระบบจะจำรหัสผ่านไม่ได้และไม่สามารถเข้าสู่ระบบได้ และฉันไม่เข้าใจจริงๆ ว่าทำไม
นี่คือรหัสของฉัน:
สำหรับการลงทะเบียน (อาจจะไร้ประโยชน์แต่ยังไงซะ)
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
ใน 2 กรณีของฟังก์ชัน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