Visualizzazione risultati 1 fino 4 di 4

Discussione: Problema con funzione cambia password

  1. #1
    Guest

    Question Problema con funzione cambia password

    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.

    qui di seguito i file:

    changepassword.class.php
    Codice 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
    Codice 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
    Codice PHP:
    <?php

    include 'changepassword.class.php';

    $obj = new ModifyPassword();
    $obj->ChangePassword();

    ?>
    error_definition.php
    Codice 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?

    P.S: infine ho notato una cosa strana, nel file db_config.php che contiene le info per collegarsi al db, la password era errata ma lo script riusciva lo stesso a collegarsi al db e modificare i dati...come è possibile una cosa del genere?

    Grazie anticipatamente!
    Ultima modifica di gbtchiaravalle : 24-08-2013 alle ore 14.12.27

  2. #2
    Guest

    Predefinito

    Scusate l'up ma nessuno sa aiutarmi dopo 3 giorni? :(

  3. #3
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,745

    Predefinito

    Andiamo per ordine: anzitutto, perché hai bisogno di definire una classe per eseguire tutto questo? Non ha molto senso, in quanto difficilmente necessiterai di creare più istanze (al più usa solamente metodi statici), poi dovresti almeno evitare di accedere alla variabile $_POST all'interno della classe, passa le informazioni necessarie mediante dei parametri; inoltre da un lato usi funzionalità recenti del linguaggio, come appunto le classi, dall'altro usi le funzioni mysql_* deprecate.
    Tralasciando queste questioni, non sono riuscito a riprodurre il problema che segnali: lo script identifica correttamente se il campo è compilato con una stringa alfanumerica e in caso contrario sospende l'esecuzione dello stesso correttamente.
    Sono comunque presenti altre cose di cui non comprendo l'utilità: perché passi il valore inserito nei campi attraverso la funzione trim quando vai a controllarne la lunghezza? Perché costringere l'utente a usare solo certi caratteri nella propria password? Perché non hai incluso controlli relativi all'utente che esegue l'operazione? Così com'è ora il codice, sembra che un qualsiasi utente possa cambiare le password di tutti gli altri utenti, un utente malintenzionato potrebbe ad esempio usare un dizionario di password e cercare di reimpostare il maggior numero di password per poi così tentare di accedere alle utenze compromesse.

    Per quanto riguarda la chiamata alla funzione mysql_close, il messaggio di errore ti indica che la variabile $db non contiene il riferimento al database, ma il valore null. In ogni caso, se chiamata senza fornire argomenti, il comportamento predefinito è quello di chiudere l'ultima connessione aperta. Effettuare la chiamata senza il riferimento al database è comunque coerente alle precedenti chiamate alle funzioni mysql_* (anche lì non fornisci il riferimento al database, ed implicitamente usano l'ultima connessione). Per quanto riguarda le credenziali del database, vedi la relativa voce dell': http://it.altervista.org/wiki/index....nessione_MySQL.
    Ah, per coerenza con la sintassi usata per l'elemento HTML input, dovresti usare il tag autoconclusivo anche per l'elemento br, così:
    Codice:
    <br />

  4. #4
    Guest

    Predefinito

    Ho omesso di dire che oltre all'md5 ho tolto anche i controlli relativi all'utente perchè infatti, ora come ora, se lo script trova 2 password uguali nel db le cambia tutte e due ma avendo problemi ho deciso di eliminare tutto il superfluo e fare delle prove solo su una riga del db.

    Passavo le variabili come dicevi tu ma avevo problemi anche lì e le variabili tornavano vuote inoltre avevo problemi con pdo e mysqli quindi ho ripiegato per lo script postato, cercherò di informarmi meglio sulle classi etc.

    Per quanto riguarda il trim era per riportare la lunghezza effettiva della password senza spazi bianchi...lo avevo letto su una guida ma probabilmente era vecchia.

    Ho letto quello che mi hai linkato: ora so perchè lo script unzionava a prescindere.

    Grazie per la risposta!

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •