Сброс пароля не работает при входе в php

Я застрял со сбросом пароля в 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;
}

person chi    schedule 30.12.2016    source источник
comment
Не понимаю, что ты говоришь. У меня есть поля для каждого пароля. И операция проверки между старым и новым паролем работает.   -  person chi    schedule 30.12.2016
comment
Все, что я вижу, это то, что вы используете setPassword($newPassword,, но затем используете $password в двух экземплярах вашей функции 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, и это сработало, я не думал, что это может быть проблемой, потому что в других языках я могу установить имя аргумента, какое захочу, а затем использовать другое имя аргумента, и они заменили друг друга, как вы знаете. Во-вторых, я до сих пор не понимаю вашего ответа с подготовленным заявлением. В основном я использовал 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