Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2005
    Messaggi
    38

    [PHP] Problema con sessioni

    Ciao a tutti,
    Ho un problema con le sessioni.. o meglio non riesco a chiuderle.
    Ho un piccolissimo progettino di login composto da tre pagine:

    Prima pagina (Controlla se si è gia registrati altrimenti redirige verso la pagina di login):
    Codice PHP:
    <?php
    session_start
    ();

    if(!isset(
    $_SESSION['user'])) {
        
    header("Location:log.php");
    }
    ?>
    [...]HTML TAGS[...]
    <?php

    $name 
    $_SESSION['user'];
    $ssid session_id();

    $out  "Ciao $name
    "
    ;
    $out .= "L\'ID sessione è:$ssid
    "
    ;

    echo 
    $out;
    ?>
    [url="out.php"]Logout[/url]
    [...]HTML TAGS[...]
    la seconda pagina che esegue il login (se giusto mi riporta alla pagina 1 con il contenuto 'protetto')
    Codice PHP:
    <?php
    if(isset($_POST['user']) && isset($_POST['pwd'])) {
        if(
    $_POST['user'] == "example" && $_POST['pwd'] == "example") {
            
    session_start();
            
    $_SESSION['user'] = $_POST['user'];
            
    $_SESSION['upwd'] = $_POST['pwd'];
            
    header("Location:default.php");
        }
    }
    ?>
    [...]HTML HEADERS[...]
    <body>
    <form action="log.php" method="post">
    <label>Inserisci Usernname:</label>


    <input type="text" name="user" />




    <label>Inserisci Password:</label>


    <input type="password" name="pwd" />




    <input type="submit" value="Loggati" />
    </form>
    </body>
    </html>
    la terza pagina.. quella che dovrebbe eseguire un'ipotetico logout
    Codice PHP:
    <?php
    session_start
    ();
    $_SESSION=array();
    session_destroy();
    header("Location:default.php");
    ?>
    Il problema è questo.. quando tento il logout dal link della pagina 1, la pagina di logout viene eseguita senza errori poi come previsto mi redirige alla prima supponendo che avendo desettato le variabili di sessione e distrutto la sessione questa si comporti come se fosse la prima visita e invece... spiattella ben benino le stesse informazioni di sessione di prima. Inoltre ho notato che se chiudo e riapro il browser e ricarico la pagina si inizia nuovamente da capo come dovrebbe essere, ma le sessioni non hanno un timeout di 30 min ? oppure ho letto male? Grazie per l'aiuto!

  2. #2

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2004
    Messaggi
    378
    session_start va all inizio

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2005
    Messaggi
    38
    Grazie per le risposte.
    Io ho già letto quei due post.. e se ho scritto significa che non sono riuscito a risolvere.
    Per quanto riguarda la chiusura del browser e la sessione termina ho supposto che fosse per causa del cookie PHPSESSID. Ho provato a distruggerlo ma la sessione continua ad esistere..
    Tutti i session_start(); sono all'inizio.
    Non capisco doe sto sbagliando.. non capisco come mai.. dopo aver distrutto la sessione, desettato tutte le variabili cerco di mia iniziativa di puntare sulla pagina che in teoria dovrebbe essere protetta la pagina continua a darmi le informazioni relative alla sessione precedente.. e questo invece non si verifica se chiudo e riapro il browser!
    Nel primo link che mi hai dato si parla di rigenerare l'id.. cosa che io non voglio fare anche perchè non mi serve.. io voglio solo creare una sessione e distruggerla.
    Nel secondo invece viene chiesto come prolungare la sessione.. cosa che io non voglio fare... la domanda sulla durata della sessione che ho fatto è solo per sapere se avevo ragione o meno.
    Grazie

  5. #5
    La sessione ha due vite. Una lato server che scade di suo per inattivita' determinato dal timeout impostato da qualche parte (e' PHP_INI_ALL), una lato CLIENT che di default (e' pure questa impostazione PHP_INI_ALL) scade alla chiusura del browser.

    Dove e' allora il problema.... ? Se dal lato client non si chiude il browser il cookie di sessione continua ad essere valido. session_start() legge il cookie e cerca se un file di sessione con lo stesso id e' gia' presente e il timeout non sia scaduto (viene letta data/ora ultima apertura file), se non e' presente alcuna sessione valida ne aprira' una nuova.

    Se hai rimosso il contenuto di $_SESSION al controllo risultera' "vuoto" e prendera' la decisione stabilita nel if...

    Se rivedi gli stessi dati devi fare attenzione alla cache del browser che ripresenta gli stessi dati.

    Verifica il contenuto nel file di sessione e controlla se viene svuotato oppure no con $_SESSION = array().

    ps,: metti sempre un exit; dopo gli header location.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2005
    Messaggi
    38
    Ho provato nella pagina di logout a togliere il redirect e aggiungere un link.
    Ho poi modificato lo script in questo modo:
    Codice PHP:
    <?php
    session_start
    ();
    $_SESSION=array();
    session_destroy();
    echo 
    $_SESSION['user'];
    ?>
    La variabile $_SESSION['user']; risulta svuotata.
    Intendevi dire questa verifica?
    Ad ogni modo, come punto di nuovo alla pagina protetta la variabile $_SESSION['user']; contiene nuovamente l'informazione precedente. Non riesco a capire questo comportamento, capisco che il cookie è ancora presente, ma non ha memorizzato le info di $_SESSION['user'] ma solo l'id della sessione, allora da dove recupera nuovamente l'informazione? Cosa molto strana.. sino ad ora ho sempre riprovato modificando quà e là.. ora anche se chiudo il browser, elimino i file temporanei dal browser e ricarico la pagina protetta riecco le informazioni di prima.. VVoVe: e dove le pesca?
    E poi il cookie della sessione sarebbe reperibile da $_COOKIE['PHPSESSID']; non si può eliminarlo usando setcookie('PHPSESSID','',time()-$time); ?
    Ci ho provato.. ma stesso risultato anzi.. se richiedo subito dopo $_COOKIE['PHPSESSID'] riecco l'id di sessione... ovviamente l'id è sempre lo stesso.. anche dopo session_destroy(); non cambia mai insomma.
    Grazie

  7. #7
    mamma che confusione.

    Se viene usato lo stesso session_id ma la sessione e' vuota "chettefrega".... Se fai le cose correttamente una volta che gli hai sparato un $_SESSION=array() stai pur certo che nel file di sessione non c'e' piu' trippa per i gatti.... Se vedi qualcosa lo vedi per via della cache del browser. Non dimenticare che se client e server condividono le stesse risorse (stesso pc) non e' manco chiaro stabilire dove inizia il server e dove inizia il client.

    Ti metto due file aa1.php e aa2.php ... prova a giocarci su, fai dei refresh, passa da pag1 a 2 e viceversa.... ho impostato il time out sia lato server che client a 20 secondi.... azzolo se cambia il session_id dopo 20 secondi... ma quello che conta e' che la sessione sara' VUOTA dopo avere eseguito $_SESSION = array() oppure alla scadenza del cookie/file di sessione....

    file aa1.php
    Codice PHP:
    <?php
    // time out lato server e cookie impostato a 20 secondi
    ini_set('session.gc_maxlifetime''20');
    ini_set('session.cookie_lifetime''20');
    session_start();
    echo 
    "<pre>";
    if(empty(
    $_SESSION)) { 
        echo 
    "Sessione vuota 
     Session id: " 
    .session_id();
        echo 
    "
     tutti a nanna
    "
    ;

    print_r($_SESSION);

    echo 
    "Ora valorizziamo la sessione in vari modi

    1) trasferendo un array completo
    2) con un ciclo foreach
    3) con singoli valori"
    ;

    $_test1 = array('one'=> 'first','two' => 'second''last'=>'last');
    $_test2 = array('foo1'=> 'firstfoo','foo2' => 'secondfoo''foolast'=>'lastfoo');

    //1
    $_SESSION $_test1;
    //2
    foreach($_test2 as $key => $value)  {
        
    $_SESSION[$key] = $value;
        }
    //3
    $_SESSION['user'] = 'pippo';
    $_SESSION['id'] = session_id();
    } else echo 
    "la sessione non e' vuota 
    "

    echo 
    '
    ----
    Valori inseriti ora in $_SESSION, valori che passo alla pag.2
    '
    ;
    print_r($_SESSION);

    echo 
    "
    <a href=\"aa2.php\">to page 2</a>"
    ;
    ?>
    file aa2.php
    Codice PHP:
    <?php
    // time out lato server e cookie impostato a 20 secondi
    ini_set('session.gc_maxlifetime''20');
    ini_set('session.cookie_lifetime''20');
    session_start();
    print 
    session_id();
    print 
    "<pre>";

    if(empty(
    $_SESSION['id']) OR $_SESSION['id'] != session_id() )
       {  echo 
    "
    sessione non valida"
    ;   }
         else echo 
    "
    ok sessione valida"
    ;

    if(!empty(
    $_SESSION) ) {
       print 
    "
    <pre>"
    ;
       
    print_r($_SESSION);
       } else  {
                print (
    '
    $_SESSION is empty 
    '
    );
               }
    print 
    "[url='aa1.php']to page 1[/url]

    "
    ;

    // azzero la sessione
    $_SESSION = array();
    session_destroy();

    echo 
    "Sessione azzerata
    "
    ;
    print_r($_SESSION);
    ?>
    cambia il timeout con valori che ti pare e verifica che succede.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

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.