รีเซ็ตรหัสผ่านไม่ทำงานเมื่อเข้าสู่ระบบ php

ฉันติดอยู่กับการรีเซ็ตรหัสผ่านใน 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;
}

person chi    schedule 30.12.2016    source แหล่งที่มา
comment
ไม่เข้าใจสิ่งที่คุณกำลังพูด ฉันมีช่องสำหรับรหัสผ่านทุกอัน และการดำเนินการตรวจสอบระหว่างรหัสผ่านเก่าและรหัสผ่านใหม่นั้นใช้งานได้   -  person chi    schedule 30.12.2016
comment
ทั้งหมดที่ฉันเห็นคือคุณกำลังใช้ setPassword($newPassword, แต่จากนั้นใช้ $password ใน 2 กรณีของฟังก์ชัน setPassword() ของคุณ ตรวจสอบให้แน่ใจว่าไม่มีช่องว่างที่ส่วนท้ายของรหัสผ่านใหม่เช่นกัน และคอลัมน์ที่เกี่ยวข้องกับรหัสผ่านทั้งหมดยาวพอที่จะเก็บแฮชทั้งหมด ซึ่งมีอายุ 60+ นอกจากนั้น ฉันไม่รู้ว่าทำไมการรีเซ็ต/การเข้าสู่ระบบของคุณจึงล้มเหลว ตรวจสอบให้แน่ใจว่ายังคงตั้งค่าอาร์เรย์เซสชันและสำหรับผู้ใช้รายเดียวกัน นี่อาจจะล้มเหลวอย่างเงียบ ๆ เนื่องจากมีการแฮชอะไรบางอย่าง แต่อะไรนะ? ดูสิ่งที่ var_dump() เผยด้วย   -  person Funk Forty Niner    schedule 30.12.2016
comment
คุณควรใช้ข้อความที่เตรียมไว้สำหรับทุกสิ่งด้วย คุณเปิดรับการฉีด SQL ที่นี่   -  person Funk Forty Niner    schedule 30.12.2016
comment
โดยที่ฉันไม่ได้ใช้คำสั่งที่เตรียมไว้? ขอบคุณสำหรับคำตอบ ฉันจะตรวจสอบสิ่งนี้   -  person chi    schedule 30.12.2016
comment
ไม่ การทำ prepare ไม่ถือเป็นคำสั่งที่เตรียมไว้ แต่ใช้ได้กับ execute() แต่สิ่งเหล่านั้นสามารถจำกัดให้แคบลงเหลือแค่ query() นี่คือคู่มือสำหรับคำสั่งที่เตรียมไว้ใน mysqli_ php.net/manual/en/mysqli.prepare .php   -  person Funk Forty Niner    schedule 30.12.2016
comment
ประการแรก ปัญหาคืออาร์กิวเมนต์สำหรับฟังก์ชัน setPassword ฉันแทนที่ด้วย $newPassword และใช้งานได้ ฉันไม่คิดว่านี่อาจเป็นปัญหา เพราะในภาษาอื่น ฉันสามารถตั้งชื่อ arg อะไรก็ได้ที่ฉันต้องการ แล้วใช้ชื่อ arg อื่น แล้วชื่อเหล่านั้นจะแทนที่กันที่คุณรู้จัก ประการที่สอง ฉันยังไม่ได้รับคำตอบจากข้อความที่เตรียมไว้ ฉันใช้ PDO ส่วนใหญ่ไม่ใช่ mysqli แต่ทำไมฉันถึงเปิดรับการแทรก SQL?   -  person chi    schedule 30.12.2016
comment
ประการแรก ปัญหาคืออาร์กิวเมนต์สำหรับฟังก์ชัน setPassword - อย่างที่ฉันสงสัย; ตัวแปรผิด (ฉันควรใส่คำตอบสำหรับสิ่งนี้เพื่อทำเครื่องหมายว่าแก้ไขแล้ว) สำหรับสาเหตุที่คุณเปิดรับการฉีด SQL โปรดดูสิ่งต่อไปนี้ มันพูดเพื่อตัวเอง stackoverflow.com/questions/60174/   -  person Funk Forty Niner    schedule 30.12.2016


คำตอบ (1)


ตามที่ฉันเขียนในความคิดเห็น:

setPassword($newPassword, $_SESSION['username']

คุณกำลังใช้ตัวแปรที่ไม่ถูกต้องใน:

function setPassword($password, $email)

...

password_hash($password,

ตัวแปรควรเป็น $newPassword ไม่ใช่ $password

รหัสของคุณล้มเหลวอย่างเงียบๆ เนื่องจาก password_hash() ทำงานได้ เพียงแต่ไม่ได้แฮชตัวแปรดังกล่าว/ต้องการ

สิ่งนี้และพร้อมกับความคิดเห็นอื่น ๆ ของฉันเกี่ยวกับการที่คุณเปิดรับการแทรก SQL

person Funk Forty Niner    schedule 30.12.2016