Ik heb een script gemaakt waarmee een gebruiker (na inloggen) zijn wachtwoord kan wijzigen. Het gaat echt niet helemaal goed met mijn if en else. Het wachtwoord wordt nu gewijzigd ook al is het oude wachtwoord niet goed ingevuld en ook al zijn de nieuwe wachtwoorden niet gelijk aan elkaar. Ik zie even door de bomen het bos niet meer maar wat gaat er mis?

<?php include('connect.php');

error_reporting(E_ALL);
error_reporting(-1);
ini_set('error_reporting', E_ALL);
ini_set('error_log', 'error.log');

    global $wrongPwdErr, $accountNotExistErr, $emailPwdErr, $email_empty_err, $pass_empty_err;

    if(isset($_POST["submit"])) 
    {
        $oudwachtwoord     = $_POST['oudwachtwoord'];
        $nieuwwachtwoord     = $_POST['nieuwwachtwoord'];
        $nieuwwachtwoordcontrole     = $_POST['nieuwwachtwoordcontrole'];

        // clean data 
        $pswdoud = mysqli_real_escape_string($connection, $oudwachtwoord);
        $pswdnieuw = mysqli_real_escape_string($connection, $nieuwwachtwoord);
        $pswdnieuwcontrole = mysqli_real_escape_string($connection, $nieuwwachtwoordcontrole);

        // get from session
        $email = $_SESSION['email'];

        // Query if email exists in db
        $sql = "SELECT wachtwoord, is_active From gebruikers WHERE email = '{$email}' ";
        $query = mysqli_query($connection, $sql);
        $rowCount = mysqli_num_rows($query); 

        // If query fails, show the reason 
        if(!$query){
           die("SQL query failed: " . mysqli_error($connection));
        }
        
        // Fetch user data 
        while($row = mysqli_fetch_array($query)) {
            $pass_word = $row['wachtwoord'];
            $is_active = $row['is_active'];
        }


          // Verify password

            if (password_verify($oudwachtwoord, $pass_word)) {
                $password = password_verify($oudwachtwoord, $pass_word);

            } else {
                $status = "NOTOK";
                $foutoudwachtwoord = '<div class="alert alert-danger">
                Het huidige wachtwoord klopt niet. '.$status.'
                </div><br>';
            }

            if ($pswdnieuw == $pswdnieuwcontrole) { 

            } else {
                $status = "NOTOK";
                $wachtwoordnietgelijk = '<div class="alert alert-danger">
                                         De nieuwe wachtwoorden komen niet overeen. '.$status.'
                                         </div><br>';
             }
       
            if(preg_match("/^(?=.*\d)(?=.*[A-Za-z])[0-9A-Za-z!@#$%]{8,30}$/", $pswdnieuw)) {

            } else {
                $status = "NOTOK";
                $wrongPwdErr = '<div class="alert alert-danger">
                        Wachtwoord moet tussen de 8 en 30 karakters zijn met een hoofdletter, kleine letter en een cijfer. '.$status.'
                    </div>';
            }

            // Check if email exist
            if($rowCount <= 0) {
                $status = "NOTOK";
                $accountNotExistErr = '<div class="alert alert-danger">
                        Onjuiste gegevens, probeer opnieuw. '.$status.'
                    </div><br>';
            } else {
                $status = "OK";
            }

      
            
            if ($status == "OK")
            {
                // Allow only active user
                if($is_active == '1') 
                    {
                    
                    $password_hash = \password_hash($password, PASSWORD_ARGON2ID);

                        // Query
                        $sql2 = "UPDATE gebruikers SET wachtwoord = '{$password_hash}' WHERE email = '{$email}' ";
                        
                        // Create mysql query
                        $sqlQuery = mysqli_query($connection, $sql2);

                        $success_msg = '<br><div class="alert alert-danger">Het wachtwoord is gewijzigd! '.$status.'<br></div>';
                        
                            if(!$sqlQuery)
                            {
                                die("MySQL query failed!" . mysqli_error($connection));
                            } 

                    } 
                    else {
                          $emailPwdErr = '<div class="alert alert-danger">
                                         Dit account is niet meer actief.
                                        </div><br>';
                        }
            } 
            else {

            }

    }
?>
De volgorde van controleren klopt niet.

Je SELECT een record maar je controleert niet of dat werkelijk bestaat.

Je controleert vervolgens de wachtwoorden en geeft zonodig een $status NOTOK.

Pas op regel 72 controleer je daadwerkelijk of het record voorkomt.
Zo ja, dan $status OK.

Die $status gebruik je om het record bij te werken op regel 83, ongeacht de wachtwoordcontroles.

Op regel 89 doe je een passwordhash van $password in plaats van $pswdnieuw.
(De \ zou een php foutmelding moeten geven.)

Het record wordt bijgewerkt als ook $is_active = 1.

Echter, op regel 44 geef je de waarde TRUE aan $password als $oudwachtwoord correct is.
Password-verify geeft TRUE of FALSE.

Derhalve zal op regel 89 een hash worden gemaakt van TRUE of FALSE en niet van het nieuwe wachtwoord.

De $is_active status zou je al met de SELECT kunnen doen.

Reageren