Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    174

    Modifica autonoma dei dati di sessione

    Buongiorno a tutti. Da due giorni mi sto imbattendo su un problema riguardante un sito di mia realizzazione per conto di un'azienda ed, a scelta di questa, hostato su aruba.
    Il sito è realizzato in php e gestisce un db per gli utenti, un (molto) mini cms per delle news che vengono pubblicate nella hp del sito, a sua volta collegata ad una mailing list, ed un sistema di memorizzazione dinamica delle faq che eventuali utenti inoltrano.
    Per quanto riguarda gli utenti, ne vengono gestiti di 3 tipologie:
    1. visitatori
    2. editori (in grado di pubblicare le news)
    3. amministratori (in grado di gestire gli utenti e fare ciò che possono le categorie 1 e 2).
    Al momento del login, se questo va a buon fine, memorizzo in sessione ottengo il seguente risultato
    codice:
    Array
    (
        [user_id] => 1
        [access_level] => 3
        [lifetime] => 1314429142
    )
    dove lo user_id è l'id dell'utente, access_level rappresenta le categorie sopra citate e lifetime un contatore per gestire la durata e scadenza della sessione.
    Le categorie di utenti 2 e 3 possono accedere ad un pannello di controllo per gestire quanto di loro competenza ed è qui che mi si scatena il problema.
    Se sul db è registrato un singolo utente allora tutto va a meraviglia per l'amministratore, può fare quanto di sua competenza senza problemi.
    Nel momento in cui sul db sono registrati da 2 utenti a salire nel momento in cui, un amministratore si logga ed entra nel pannello i dati in sessione si modificano assumendo i valori dell'utente a lui successivo. Ora un'operazione del genere non la faccio in alcuna parte del codice e ho provato ad isolare lo script che può causare il malfunzionamento, ma senza alcun successo.
    Io tra l'altro imputerei il problema ad aruba in quanto sia in locale che su altervista (ho, per prova, messo il sito anche li) il problema non mi si verifica.
    Voi avreste qualche suggerimento?
    Sarei molto grato per un aiuto perchè non so proprio dove andare a sbattere.
    Se avete la necessità di ulteriori informazioni o del codice per capire il problema chiedete pure.
    Grazie infinite a coloro che mi daranno una mano.

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    39
    mha guarda, prova a vedere la versione di php, io ti dico ho aruba azi c'ho lavorato e non ho mai avuto problemi di questo genere, secondo me c'è qualcosa nel codice...

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    174
    Boh, non so veramente cosa dire! La versione di php su aruba (dal phpinfo) è la 5.2.12 comunque la cosa che non torna è che da altre parti funziona.

  4. #4

    Re: Modifica autonoma dei dati di sessione

    Originariamente inviato da Hermiod
    ...Nel momento in cui sul db sono registrati da 2 utenti a salire nel momento in cui, un amministratore si logga ed entra nel pannello i dati in sessione si modificano assumendo i valori dell'utente a lui successivo....
    Prova a postare il codice in cui gestisci questa cosa, perchè altrimenti la vedo dura venirne a capo.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    174
    Questo è il codice della pagina in cui si verifica il problema
    codice:
    <?php 
    include 'header.inc.php'; 
    
    $db = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD) or die('Unable to connect. Check your connection parameters.');
    mysql_select_db(MYSQL_DB, $db);
    
    if (isset($_SESSION['access_level']) && $_SESSION['access_level'] > 1) {
        if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'search') {
            $keyword = $_REQUEST['keyword'];
        } else {
            $keyword = '';
        }
    ?>
    <div id="navigation">
        ...
    </div>
    <div id="content">
        <div id="tabs">
            <ul>
                <?php echo ($_SESSION['access_level'] == 3) ? '[*]Utenti' : ''; ?>[*]News
                <?php echo ($_SESSION['access_level'] == 3) ? '[*]FAQ' : ''; ?>[/list]
    <?php
        if ($_SESSION['access_level'] == 3) { 
    ?>
            <div id="tabs-1">
                
    
    
                    Di seguito &egrave; riportata una tabella contenente la lista 
                    degli utenti registrati sul sistema; ...
                </p>    
                <table id="users_table">
                    <caption>
                        <div style="margin-bottom: 10px; text-align: right;">
                            <form id="search_form" action="cpanel.php#tabs-1" method="post">
                                <input class="text_field" type="text" name="keyword" size="30" autofocus/>
                                <input type="hidden" name="action" value="search" />
                            </form>
                        </div>
    <?php
            if (isset($_REQUEST['keyword']) && !empty($_REQUEST['keyword'])) {
                $keyword = $_REQUEST['keyword'];
                $query = 'SELECT
                        *
                    FROM 
                        all_users
                    WHERE
                        first_name LIKE "%' . mysql_real_escape_string($keyword, $db) . '%" OR ' .
                        'last_name LIKE "%' . mysql_real_escape_string($keyword, $db) . '%" OR ' .
                        'email LIKE "%' . mysql_real_escape_string($keyword, $db) . '%"';
                $result = mysql_query($query, $db) or die(mysql_error($db));
                echo '<div>';
                if (mysql_affected_rows($db) > 0) {
                    echo '
    
    La ricerca per ' . $keyword . ' ha fornito i seguenti risultati...</p>';
                } else {
                    echo 'La ricerca non ha fornito alcun risultato.';
                    echo '<tr><td colspan="6" style="text-align: center;">Nessun risultato</td></tr>';
                }
                echo '</div>';
            } else {
                $query = 'SELECT * FROM all_users';
                $result = mysql_query($query, $db) or die(mysql_error($db));
            }
    ?>                    
                    </caption>
                    <thead>
                        <tr>
                            <th class="id_column">ID</th>
                            <th>Cognome</th>
                            <th>Nome</th>
                            <th class="email_column">Email</th>
                            <th class="action_column">Azioni</th>
                            <th class="active_column">Attivo</th>
                        </tr>
                    </thead>
                    <tbody>
    <?php
            while ($row = mysql_fetch_array($result)) {
                extract($row);
                //costruisco la tabella
            }
            mysql_free_result($result);
    ?>
                    </tbody>
                </table>
    <?php
            $query = 'SELECT COUNT(user_id) AS num_users FROM all_users';
            $result = mysql_query($query, $db) or die(mysql_error($db));
            $row = mysql_fetch_array($result);
    ?>    
                <div>
                    
    
    Sul sistema sono registrati un totale di <?php echo $row['num_users']; ?> utenti.</p>
                </div>
            </div>
    <?php
        }
    ?>        
            <div id="tabs-2">
                
    
    
                    Di seguito &egrave; riportata una tabella contenente la lista 
                    delle news...
                </p>
                <table id="news_table">
                    <caption>
                        <div style="margin-bottom: 10px; text-align: right;">
                            <form id="search_form" action="cpanel.php#tabs-2" method="post">
                                <input class="text_field" type="text" name="keyword" size="30" autofocus/>
                                <input type="hidden" name="action" value="search" />
                            </form>
                        </div>
    <?php
            $query = 'SELECT 
                    news_id, user_id, is_published, submit_date, publish_date, title, news_text 
                FROM 
                    all_news ';
            if ($_SESSION['access_level'] == 2) {
                $query .= 'WHERE user_id = ' . $_SESSION['user_id'] . ' ';
            }
            $query .= 'ORDER BY news_id';
            $result = mysql_query($query, $db) or die(mysql_error($db));
    ?>                    
                    </caption>
                    <thead>
                        <tr>
                            <th class="id_column">ID</th>
                            <th>Editore</th>
                            <th class="pub_column">Pubblicata</th>
                            <th class="saved_column">Salvataggio</th>
                            <th class="publi_column">Pubblicazione</th>
                            <th class="action_column">Azioni</th>
                        </tr>
                    </thead>
                    <tbody>
    <?php
            if (mysql_affected_rows() == 0) {
                echo '<tr><td colspan="6" style="text-align: center;">Non ci sono news pubblicate</td></tr>';
            } else {
                while ($row = mysql_fetch_array($result)) {
                    extract($row);
                    // costruisco la tabella
                }
            }
            mysql_free_result($result);
    ?>
                    </tbody>
                </table>
    <?php
            if ($_SESSION['access_level'] == 3) {
                $query = 'SELECT COUNT(user_id) AS num_news FROM all_news';
                $result = mysql_query($query, $db) or die(mysql_error($db));
                $row = mysql_fetch_array($result);
    ?>    
                <div>
                    
    
    Sul sistema sono salvate un totale di <?php echo $row['num_news']; ?> news.</p>
                </div>
    <?php
            }
    ?>
            </div>
    <?php
        if ($_SESSION['access_level'] == 3) { 
    ?>        
            <div id="tabs-3">
                
    
    
                    Di seguito &egrave; riportata una tabella contenente la lista 
                    delle faq...
                </p>
                <table id="faqs_table">
                    <caption></caption>
                    <thead>
                        <tr>
                            <th class="id_column">ID</th>
                            <th class="email_column">Email</th>
                            <th class="name_column">Nome</th>
                            <th class="action_column">Azioni</th>
                        </tr>
                    </thead>
                    <tbody>
    <?php
    $query = 'SELECT * FROM all_faqs';
    $result = mysql_query($query, $db) or die(mysql_error($db));
    if (mysql_affected_rows($db) == 0) {
        echo '<tr><td colspan="6" style="text-align: center;">Non ci sono faq pubblicate</td></tr>';
    } else {
        while ($row = mysql_fetch_array($result)) {
            extract($row);
            // costruisco la tabella
    }
    ?>
                    </tbody>
                </table>
            </div>
    <?php
        }
    ?>
        </div>
    </div>
    <?php
    } else {
        redirect('index.php');
    }
    
    include 'footer.inc.php';
    ?>
    il footer.inc.php non contiene nulla a parte del puro codice html mentre in header.inc.php c'è questo

    codice:
    <?php
    
    session_start();
    
    require 'utils/http_functions.php';
    require 'utils/config.inc.php';
    require 'utils/db.inc.php';
    
    $db = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD) or die('Unable to connect. Check your connection parameters.');
    mysql_select_db(MYSQL_DB, $db);
    
    // controllo se la sessione è valida
    if (isset($_SESSION['lifetime'])) {
        if (time() - $_SESSION['lifetime'] > SESSION_TTL) {
            // no
            session_unset();
            session_destroy();
    
            // controllo se esiste il cookie
            if (isset($_COOKIE['sito'])) {
                // si, rigenero la sessione dal cookie
                // estraggo le informazioni dal cookie
                $email = $_COOKIE['sito'][0];
                $password = $_COOKIE['sito'][1];
                
                // recupero i dati da db
                $query = 'SELECT
                        user_id, password, access_level, last_name
                    FROM
                        all_users
                    WHERE
                        MD5(email) = "' . mysql_real_escape_string($email, $db) . '" AND
                        MD5(password) = "' . mysql_real_escape_string($password, $db) . '" AND
                        is_active = TRUE';
                echo $query;
                $result = mysql_query($query, $db) or die(mysql_error($db));
                if (mysql_num_rows($result) > 0) {
                    $row = mysql_fetch_array($result);
                    extract($row);
                    session_start();
                    $session_data = array(
                        'user_id' => $user_id,
                        'access_level' => $access_level,
                        'lifetime' => time()
                    );
                    $_SESSION = $session_data;
                    
                    redirect($_SERVER['PHP_SELF']);
                } else {
                    // le informazioni non sono corrette si deduce che è un accesso non autorizzato
                    $exp_date = time() - COOKIE_TTL;
                    setcookie('sito[0]', null, $exp_date);
                    setcookie('sito[1]', null, $exp_date);
                    redirect('error.php?from=home&errno=2');
                }
            } else {
                // la sessione è scaduta e non è recuperabile
                // redirezione alla pagina di errore [sessione scaduta]
                redirect('error.php?from=home&errno=1');
            }
        }
        
        // la sessione è ancora valida e quindi non faccio nulla
    } else {
        // la sessione non è valida
        // controllo se esiste il cookie
        if (isset($_COOKIE['sito'])) { 
            // si, rigenero la sessione dal cookie
            // estraggo le informazioni dal cookie
            $email = $_COOKIE['sito'][0];
            $password = $_COOKIE['sito'][1];
    
            // recupero i dati da db
            $query = 'SELECT
                    user_id, password, access_level, last_name
                FROM
                    all_users
                WHERE
                    MD5(email) = "' . mysql_real_escape_string($email, $db) . '" AND
                    MD5(password) = "' . mysql_real_escape_string($password, $db) . '" AND
                    is_active = TRUE';
            echo $query;
            $result = mysql_query($query, $db) or die(mysql_error($db));
            if (mysql_num_rows($result) > 0) {
                $row = mysql_fetch_array($result);
                extract($row);
                session_start();
                $session_data = array(
                    'user_id' => $user_id,
                    'access_level' => $access_level,
                    'lifetime' => time()
                );
                $_SESSION = $session_data;
                
                redirect($_SERVER['PHP_SELF']);
            } else {
                // le informazioni non sono corrette si deduce che è un accesso non autorizzato
                $exp_date = time() - COOKIE_TTL;
                setcookie('sito[0]', null, $exp_date);
                setcookie('sito[1]', null, $exp_date);
                
                redirect('error.php?from=home&errno=2');
            }
        }
    }
    // faccio il refresh della sessione se ne esiste una valida
    if (isset($_SESSION['lifetime'])) {
        $_SESSION['lifetime'] = time();
    }
    ?>
    ...
    http_functions contiene una funzione che mi fa il redirect mentre config e db contengono solo delle define.
    Ho cercato di essere il più conciso possibile nel postare il codice, scusate per la lunghezza, ma non volevo omettere dettagli che potevano rivelarsi fondamentali.

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    174
    Questo invece è il codice che setta i cookie e la sessione
    codice:
    case 'Login':
                // E' stata fatta una richiesta di accesso quindi controllo le credenziali
                $email = (isset($_POST['email'])) ? $_POST['email'] : '';
                $password = (isset($_POST['password'])) ? $_POST['password'] : '';
                $sql = 'SELECT
                        user_id, password, access_level, last_name
                    FROM
                        all_users
                    WHERE
                        email = "' . mysql_real_escape_string($email, $db) . '" AND
                        password = PASSWORD("' . mysql_real_escape_string($password, $db) . '") AND
                        is_active = TRUE';
                $result = mysql_query($sql, $db) or die(mysql_error($db));
                if (mysql_num_rows($result) > 0) {
                    // dati corretti
                    // creo la sessione
                    $row = mysql_fetch_array($result);
                    extract($row);
                    $session_data = array(
                        'user_id' => $user_id,
                        'access_level' => $access_level,
                        'lifetime' => time()
                    );
                    $_SESSION = $session_data;
    
                    // controllo se si preferisce memorizzare le informazioni
                    if (isset($_POST['rememberme'])) {
                        // creo il cookie
                        $cookie_data = array(
                            md5($email),
                            md5($password)
                        );
                        $exp_date = time() + COOKIE_TTL;
                        setcookie('sito[0]', $cookie_data[0], $exp_date, COOKIE_DOMAIN);
                        setcookie('sito[1]', $cookie_data[1], $exp_date, COOKIE_DOMAIN);
                    }
                    
                    $url = $_SERVER['HTTP_REFERER'];
                } else {
                    // invalido i cookie
                    $exp_date = time() - COOKIE_TTL;
                    setcookie('sito[0]', null, $exp_date, COOKIE_DOMAIN);
                    setcookie('sito[1]', null, $exp_date, COOKIE_DOMAIN);
                    
                    $url = '../error.php?from=home&errno=2';
                }
                mysql_free_result($result);
    
                redirect($url);
                break;

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    174
    Che ne pensate? Notate qualche bug? Grazie

  8. #8
    Utente di HTML.it L'avatar di las
    Registrato dal
    Apr 2002
    Messaggi
    1,221

    Re: Modifica autonoma dei dati di sessione

    Originariamente inviato da Hermiod
    Se sul db è registrato un singolo utente allora tutto va a meraviglia per l'amministratore, può fare quanto di sua competenza senza problemi.
    Nel momento in cui sul db sono registrati da 2 utenti a salire nel momento in cui, un amministratore si logga ed entra nel pannello i dati in sessione si modificano assumendo i valori dell'utente a lui successivo.
    il problema allora potrebbe dipendere dalla query che identifica l'utente in fase di accesso.
    Il calcolatore è straordinariamente veloce, accurato e stupido.
    L'uomo è incredibilmente lento, impreciso e creativo.
    L'insieme dei due costituisce una forza incalcolabile.
    (Albert Einstein)

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    174
    Ciao, ho postato il codice e non mi sembra ci sia qlcs che non va.

  10. #10
    Utente di HTML.it L'avatar di las
    Registrato dal
    Apr 2002
    Messaggi
    1,221
    Scusami non avevo visto il secondo post, si effettevamente la query sembra corretta anche a me, però ho notato che nella pagina dove dice che c'è l'errore usi questo:

    Codice PHP:
    while ($row mysql_fetch_array($result)) {
         
    extract($row);
         
    // costruisco la tabella

    su una query dove c'è anche access_level come risultato, questo vuol dire che la funzione extract creerà una variabile $access_level attribuendore quel valore, la cosa potrebbe creare problemi nel caso in cui il server sia impostato con register_global=On perchè in questo caso $_SESSION['access_level'] e $access_level sono la stessa cosa, e quindi la tua variabile di sessione viene sovrascritta, e questo spiegherebbe anche perchè hai il problema solo su Aruba e non su altri server, che probabilmente sono configurati con register_global=Off.

    Il calcolatore è straordinariamente veloce, accurato e stupido.
    L'uomo è incredibilmente lento, impreciso e creativo.
    L'insieme dei due costituisce una forza incalcolabile.
    (Albert Einstein)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.