Ошибка в изменении пароля с помощью Ajax / MySQLi подготовленных операторов (объектно-ориентированных)?


я не уверен, что процедура, позволяющая пользователю изменить свой пароль, является правильной.

Ajax работает нормально, потому что он показывает мне ошибки, такие как следующие ошибки:

Notice: Undefined переменная: password in C:\xampp\htdocs\users\changepass.php on line 48 Warning: password_hash() expects at least 2 parameters, 1 given in C:\xampp\htdocs\users\changepass.php on line 48 Фатальная ошибка: вызов функции члена bind_param () on boolean in C:\xampp\htdocs\users\changepass.php on line 65

может объяснить мне, как разрешить пользователю правильно изменить свой пароль. Необходимо, чтобы форма была скрыта, и покажите сообщение ¡Пароль успешно изменен!

Changepass.php

if (isset($_POST['password_change'])) {
    $hash = password_hash($password);
    $username = strip_tags($_POST['username']);
    $password = strip_tags($_POST['old_password']);
    $old_password = $hash;
    $newpassword = strip_tags($_POST['new_password']);
    $new_password = $hash;
    $confirmnewpassword = strip_tags($_POST['con_newpassword']);
    $con_newpassword = $hash;

    $stmtUsers=$con->prepare("SELECT COUNT(*) FROM users where username=? limit 1");
    $stmtUsers->bind_param("s",$username);

    if($stmtUsers->execute()) {
        $hash = $stmtUsers->fetch();
        if ($password == $hash['password']){
            if($newpassword == $confirmnewpassword) {
                $stmtUpdate=$con->prepare("UPDATE `users` SET `password` = ? WHERE `username` = ?");
                $stmtUpdate->bind_param("ss",$newpassword,$username);
                if($stmtUpdate->execute()){
                    echo "¡Contraseña cambiada con éxito!";
                } else{
                    echo "La contraseña no se pudo actualizar";
                }
            } else {
                echo "¡Las contraseñas no coinciden!";
            }

        } else {
            echo "Por favor, escriba su contraseña actual con precisión!";

        }
    } else {
        echo "Nombre de usuario incorrecto";
    }
}

Форма

<form name="resetform" action="changepass.php" id="resetform" class="passform" method="post" role="form">
    <h3>Change Your Password</h3>
    <br />
    <input type="hidden" name="username" value="<?php echo $username; ?>" ></input>
    <label>Enter Old Password</label>
    <input type="password" class="form-control" name="old_password" id="old_password">
    <label>Enter New Password</label>
    <input type="password" class="form-control" name="new_password" id="new_password">
    <label>Confirm New Password</label>
    <input type="password" class="form-control"  name="con_newpassword"  id="con_newpassword" />
    <br>
    <input type="submit" class="btn btn-warning" name="password_change" id="submit_btn" value="Change Password" />
</form>

<!--display success/error message-->
<div id="message"></div>

Аякс

<script type="text/javascript">
$(document).ready(function() {
    var frm = $('#resetform');
    frm.submit(function(e){
        e.preventDefault();

        var formData = frm.serialize();
        formData += '&' + $('#submit_btn').attr('name') + '=' + $('#submit_btn').attr('value');
        $.ajax({
            type: frm.attr('method'),
            url: frm.attr('action'),
            data: formData,
            success: function(data){
                $('#message').html(data).delay(3000).fadeOut(3000);
            },
            error: function(jqXHR, textStatus, errorThrown) {
                $('#message').html(textStatus).delay(2000).fadeOut(2000);
            }

        });
    });
});
</script>

структура таблицы пользователей: introducir la descripción de la imagen aquí

Author: Fernando, 2018-08-13

1 answers

В этом ответе, который я дал некоторое время назад, вы можете увидеть использование password_verify и password_hash https://es.stackoverflow.com/a/166704/38103

Исходя из этого давайте проверим ваш код:

if (isset($_POST['password_change'])) {
    // Asignamos variables
    $user = $_POST['username'];
    $old_password = $_POST['old_password'];
    $new_password = $_POST['new_password'];
    $con_password = $_POST['con_newpassword'];

    // comprobamos que las password coinciden
    if($con_password !== $new_password){
        echo "¡Las contraseñas no coinciden!";
        exit;
    }

    // Buscamos el usuario 
    $stmtUsers = $con->prepare("SELECT * FROM users where username=? limit 1");
    $stmtUsers->bind_param("s", $username);
    // validamos consulta
    if(!$stmtUsers->execute()) {
        echo 'Error nose pudo ejecutar la consulta';
        exit;
    }
    //obtenemos el resultado
    if(!$result = $stmtUsers->fetch()){
        echo "Nombre de usuario incorrecto";
        exit;
    }

    // validamos password bd con la introducida
    if (!password_verify($old_password, $result['password'])) {
        echo '¡La contraseña no es válida!';
        exit;
    }

    // si llegamos hasta aquí todo esta en orden y actualizamos


    // cifrados la password antes de guardarla recuerda
    $hash = password_hash($new_password, CRYPT_BLOWFISH);

    $stmtUpdate = $con->prepare("UPDATE `users` SET `password` = ? WHERE `username` = ?");
    $stmtUpdate->bind_param("ss", $hash, $username);
    if($stmtUpdate->execute()){
        echo "¡Contraseña cambiada con éxito!";
    } else{
         echo "La contraseña no se pudo actualizar";
    }
}
 2
Author: Xerif, 2018-08-13 11:23:54