Problema con funzione cambia password

Furion

Utente Attivo
26 Ago 2013
32
0
0
Salve a tutti, io ho dei problemi con una funzione che uso per cambiare le password, mi spiego meglio: la funzione in questione effettua una serie di controlli:

-Se i campi sono tutti settati,
-Se le password corrispondono tra loro,
-Se la nuova password è compresa tra 8 e 15 caratteri,
-Se la password è alfanumerica,
-Se la vecchia password è corretta.

il problema è che la funzione salta alcuni controlli, ad esempio: se i campi sono settati, le password corrispondono, la lunghezza è esatta e la password vecchia è corretta viene saltato in toto il controllo se la nuova password è alfanumerica e lo script aggiorna la password.

Per controllare se la password è alfanumerica ho provato sia con ctype_alnum e adesso con preg_match('/^[a-zA-Z0-9]+$/', $password).

Per comodità ho tolto la funzione md5 dallo script inoltre modifico solo una riga del db altrimenti nella riga
PHP:
$sql = "UPDATE users SET password = '$newpassword' WHERE password = '$oldpassword'";
uso anche l'id di chi richiede il cambio password ;).

qui di seguito i file:

changepassword.class.php
PHP:
<?php
error_reporting(E_ALL);

require('db_config.php');
 
class ModifyPassword
{

        public function ChangePassword()
        {
            $this->ErrorReport();
        }

        protected function IsEmptyField()
        {
            if(empty($_POST['oldpassword']) OR empty($_POST['password']) OR empty($_POST['password2']))
            {
                return TRUE;
            }
            else
            {
                return FALSE;
            }
        }

        protected function VerifyPassword()
        {
            if($_POST['password'] == $_POST['password2'])
            {
                return TRUE;
            }
            else
            {
                return FALSE;
            }
        }

        protected function VerifyLengthPassword()
        {
            if(strlen(trim($_POST['password'])) >= 8 && strlen(trim($_POST['password'])) <= 15)
            {
                return TRUE;
            }
            else
            {
                return FALSE;
            }
        }

        protected function VerifyAlphanumericPassword()
        {

            $password = $_POST['password'];
            if(preg_match('/^[a-zA-Z0-9]+$/', $password))
            {
                return TRUE;
            }
            else
            {
                return FALSE;
            }
        }

        protected function PasswordExists()
        {
                        $oldpassword = mysql_real_escape_string($_POST['oldpassword']);
            $sql = "SELECT password FROM users WHERE password='$oldpassword'";
            $res = mysql_query($sql);
            if($row = mysql_fetch_array($res))
            {  
                return TRUE;
            }
            else
            {   
                return FALSE;
            }
        }


        public function ErrorResult($num)
        {
            header("Location: change_password.php?alert=" . $num);
            die;
        }
 
        protected function ErrorReport()
        {
            if($this->IsEmptyField())
            {
                $this->ErrorResult(1);
            }
 
            if(!$this->VerifyPassword())
            {
                $this->ErrorResult(2);
            }

            if(!$this->VerifyLengthPassword())
            {
                $this->ErrorResult(3);
            }

            if(!$this->VerifyAlphanumericPassword())
            {
                $this->ErrorResult(4);
            }
 
            if(!$this->PasswordExists())
            {
                $this->ErrorResult(5);
            }


            $this->ChangePasswordUser();
 
        }

        protected function ChangePasswordUser()
        {
            $oldpassword = mysql_real_escape_string($_POST['oldpassword']);
            $newpassword = mysql_real_escape_string($_POST['password']);
 
            $sql = "UPDATE users SET password = '$newpassword' WHERE password = '$oldpassword'";

            $res = mysql_query($sql);
            mysql_close();

            if($res === TRUE)
            {
            die ('Password aggiornata con succeso!');
            }
            else
            {
            die ("Errore con l'aggiornamento: " . mysql_error());
            }

        }
}        
?>
change_password.php
PHP:
<?php
include 'error_definition.php';
?>
<form action="modify_password.php" method="POST">
Inserisci la tua vecchia password:<br>
<input type="text" name="oldpassword" />
<br><br>
Inserisci la nuova password:<br>
<input type="text" name="password" />
<br><br>
Ripeti la nuova password:<br>
<input type="text" name="password2" />
<br><br>

<input type="submit" value="invia" />
</form>
modify_password.php
PHP:
<?php
 
include 'changepassword.class.php';
 
$obj = new ModifyPassword();
$obj->ChangePassword();

?>
error_definition.php
PHP:
<?php
 
if(isset($_GET['alert']))
{
 
    switch($_GET['alert'])
    {
        case 1:
        die ('Tutti i campi devono essere compilati.');
        break;
 
        case 2:
        die ('Le due password inserite non corrispondono.');
        break;
 
        case 3:
        die ('La password deve essere tra 8 e 15 caratteri.');
        break;

        case 4:
        die ('La password deve essere alfanumerica.');
        break;
 
        case 5:
        die ('La password fornita è errata.');
        break;
 
    }

}

?>
Qualcuno sa dirmi perchè?

Un altro probblema che affligge questo script avviene se setto mysql_close($db); invece di mysql_close(); ricevendo l'errore:

Notice: Undefined variable: db in /membri2/furion/changepassword.class.php on line 126

Warning: mysql_close() expects parameter 1 to be resource, null given in /membri2/furion/changepassword.class.php on line 126

anche questo perchè avviene?


Grazie anticipatamente a chi mi risponderà e a chi saprà aiutarmi :fonzie:
 

Salvo Salvi

Utente Attivo
14 Nov 2012
230
0
0
Ciao, se posso esserti d'aiuto ti consiglio di non usare mysql, ma di rifare tutta la classe usando le pdo o mysqli.
Poichè mysql a breve non sarà piu valido
 

Furion

Utente Attivo
26 Ago 2013
32
0
0
Vi ringrazio per la risposta ma non ho il tempo per impararmi mysqli o pdo ora, magari in futuro chissà, quindi sareste così gentili da aiutarmi con questa classe?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.041
146
63
PR
www.borgo-italia.it
ciao
ci sono un paio di cose che non mi tornano, ma può essere che sbagli in quanto dovrei provarla.
in tutte le funzioni (salvo una) tu dai il return true se la condizione è soddisfatta.
es. nella VerifyLengthPassword() se la pass è piu luna di 8 e meno di 15 ritorni true
nella funzione IsEmptyField() invece fai il contrario
a parte che io farei un unico controllo con preg_match
preg_match('/^[a-zA-Z0-9]{8,15}$/', $password)
metti in giro dei var_dump($nome_variabile) per capire dove è l'inghippo