Visualizzazione dei risultati da 1 a 10 su 10

Discussione: durata sessioni

  1. #1
    Utente di HTML.it L'avatar di blekm
    Registrato dal
    Jun 2004
    Messaggi
    8,310

    durata sessioni

    PREMESSA: una sessione di default dura 24minuti.

    pagina 1. Imposto durata sessione a 10 minuti. Form di login.
    codice:
    session_start();
    ini_set('session.gc_maxlifetime', '600');
    pagina 2. Imposto durata sessione a 10 minuti.
    codice:
    session_start();
    ini_set('session.gc_maxlifetime', '600');
    passano 5 minuti, e tu clicchi su pagina3. Quindi rimangono 5 minuti al termine della sessione, giusto?

    pagina 3
    codice:
    session_start();
    ini_set('session.gc_maxlifetime', '600');
    adesso, quanto dura la sessione? 10minuti (come ho impostato dentro pagina 3) oppure dura 15 (10 nuova durata + 5 rimanenti della vecchia?) :master:
    Il portale sul turismo a Lucca

    Siti web Lucca

    Vendo Tex a colori di Repubblica (primi 100 numeri) - info in pvt.

  2. #2
    Utente di HTML.it L'avatar di gianiaz
    Registrato dal
    May 2001
    Messaggi
    8,027

    Re: durata sessioni

    Originariamente inviato da blekm
    PREMESSA: una sessione di default dura 24minuti.

    pagina 1. Imposto durata sessione a 10 minuti. Form di login.
    codice:
    session_start();
    ini_set('session.gc_maxlifetime', '600');
    pagina 2. Imposto durata sessione a 10 minuti.
    codice:
    session_start();
    ini_set('session.gc_maxlifetime', '600');
    passano 5 minuti, e tu clicchi su pagina3. Quindi rimangono 5 minuti al termine della sessione, giusto?
    No, nel momento in cui tu esegui un'azione il tempo viene ricalcolato da zero

  3. #3
    ma anche perche' ini_set lo devi mettere "prima" dei session_start() altrimenti valuta il tempo stabilito nel php.ini

    session_start() e' la funzione che calcola, tra le altre cose, anche il tempo di inattivita' del file. Ne abbiamo parlato in altro thread poco fa.

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

  4. #4
    Utente di HTML.it L'avatar di blekm
    Registrato dal
    Jun 2004
    Messaggi
    8,310
    Originariamente inviato da piero.mac
    ma anche perche' ini_set lo devi mettere "prima" dei session_start() altrimenti valuta il tempo stabilito nel php.ini
    ecco perchè non mi funzionava.

    Originariamente inviato da gianiaz
    No, nel momento in cui tu esegui un'azione il tempo viene ricalcolato da zero
    quindi ogni volta che faccio ini_set(...) il tempo totale è quello che specifico io.
    Il portale sul turismo a Lucca

    Siti web Lucca

    Vendo Tex a colori di Repubblica (primi 100 numeri) - info in pvt.

  5. #5
    Utente di HTML.it L'avatar di blekm
    Registrato dal
    Jun 2004
    Messaggi
    8,310
    ho deciso che non voglio impostare manualmente la durata delle sessioni.

    Ho fatto una prova su altervista (dove la durata è default, 24 minuti).

    login.php
    ->
    check.php
    ->test_login.php
    ->login.php?logout=esci


    faccio login, tutto ok. Sono nella pagina check.php. Da qua posso fare logout oppure test_login.php.

    test_login.php

    Codice PHP:
    function check_session()
    {    
    session_start();
        
        if ((isset(
    $_SESSION['usr'])) && (isset($_SESSION['pwl'])))
        {
            
    $username $_SESSION['usr'];
            
    $password $_SESSION['pwl'];
            echo 
    $username."
    "
    .$password;
        }
        else
        {
            echo 
    "attenzione, devi effettuare la procedura di login.
    "
    ;
            echo 
    "[url='login.php']clicca qui per effettuare il login[/url]";
        }    

    quindi, se da check.php io clicco su test_login.php dopo 30 minuti, dovrei vedere il messaggio del ramo ELSE, giusto?

    Invece mi stampa a video username e password.

    Qualcuno mi sa dare una dritta? :master:[
    Il portale sul turismo a Lucca

    Siti web Lucca

    Vendo Tex a colori di Repubblica (primi 100 numeri) - info in pvt.

  6. #6
    La sessione puo' scadere per due ragioni.

    1) lato client perche' l'utente ha chiuso il browser
    2) lato server per inattivita' stabilita dal time-out.

    Quello che vedi potrebbe essere il contenuto della cache del browser. Ragione per cui non e' mai consigliabile mettere dei dati sensibili nel file di sessione. sia per la cache del browser sia per la possibilita' di lettura del file di sessione normalmente disponibile a tutti gli utenti. Se lo fai per test ok, ma in produzione proprio no.

    lato server viene letta la data/ora ultima apertura del file di sessione (scritta nel file stesso). Se momento attuale - time out > data/ora attuale la sessione viene considerata scaduta.

    E' pure possibile che essendo il cookie di sessione ancora valido venga recuperata la stessa sessione. Potresti mettere un tuo controllo all'interno del file ed in caso di time out azzerare il contenuto della sessione. per esempio:

    file check1.php:
    Codice PHP:
    <?php
    session_start
    ();
    echo 
    session_id();
    echo 
    "
    <pre>"
    ;
    print_r($_SESSION);

    $_SESSION['check'] = time();
    $_SESSION['name'] = 'pippo';
    $_SESSION['pwd'] = 'pallino';


    ?>

    [url="check2.php"] vai al check2 [/url]
    aspetta 10 secondi e poi vai al file check2.php
    Codice PHP:
    <?php
    session_start
    ();
    echo 
    session_id() ."
    <pre>" 
    ;
    print_r($_SESSION);

    $timeout '10';  // 10 secondi tanto per provare
    if(isset($_SESSION['check']) and ($_SESSION['check'] + $timeout) < time() )  {

    $_SESSION = array();

    }
    echo 
    "contenuto del file di sessione dopo il check di timeout
    "
    ;
    print_r($_SESSION);
    ?>

    [url="check1.php"] vai al check1 [/url]
    come potrai vedere se e' scattato il time out verra' svuotato il file di sessione. Volendo puoi impostare tu stesso il tempo di sessione valida a prescindere dall'impostazione del php.ini

    Decidi tu quando e se svuotare il file.... se poi metti anche session_regenerate_id() ti cambiera' anche l'id.

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

  7. #7
    Utente di HTML.it L'avatar di blekm
    Registrato dal
    Jun 2004
    Messaggi
    8,310
    Originariamente inviato da piero.mac
    Quello che vedi potrebbe essere il contenuto della cache del browser. Ragione per cui non e' mai consigliabile mettere dei dati sensibili nel file di sessione. sia per la cache del browser sia per la possibilita' di lettura del file di sessione normalmente disponibile a tutti gli utenti. Se lo fai per test ok, ma in produzione proprio no.
    cache? quale cache, scusa? se io clicco su un link che mi porta alla pagina prova.php (mai aperta fino a quel momento) questa pagina non dovrebbe essere in cache... o sbaglio? :master:

    Per quanto riguarda il grassetto, le sessioni mi servono per un login (e sono meglio dei cookie).

    Originariamente inviato da piero.mac
    come potrai vedere se e' scattato il time out verra' svuotato il file di sessione. Volendo puoi impostare tu stesso il tempo di sessione valida a prescindere dall'impostazione del php.ini
    devo per forza controllare io la scadenza? perchè non scade se sono impostati 24 minuti?
    Il portale sul turismo a Lucca

    Siti web Lucca

    Vendo Tex a colori di Repubblica (primi 100 numeri) - info in pvt.

  8. #8
    stai lavorando con un pc che vede sia il client che il server.

    i dati sensibili devono essere su db e su db lasciati. Tu verifica che l'accesso sia autorizzato. e stop.

    se la sessione non e' scaduta lato client, visto che sei sullo stesso pc, puo' benissimo rileggere la cache invece del file e considerare valido il contenuto del file di sessione.

    Prova a chiudere il browser e poi vedi un po' se riesci a riprendere la stessa sessione.

    Per il resto vedi tu.... se vuoi essere sicuro metti i file di sessione in una tua cartella e non in temp dove accedono cani e porci, e controlla tu il time out di inattivita' se questo e' essenziale per il tuo lavoro.


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

  9. #9
    Utente di HTML.it L'avatar di gianiaz
    Registrato dal
    May 2001
    Messaggi
    8,027
    Se non erro, spero che piero.mac confermi la cosa funziona in questo modo:

    c'è una durata della sessione (session.gc_maxlifetime)
    c'è una durata del cookie di sessione (session.cookie_lifetime)

    In pratica c'è un meccanismo, che dopo la scadenza della sessione fa scaturire il garbage collector e rimuove i file di sessione sul server.

    Ad ogni richiesta sul server, c'è una probabilità pari a session.gc_probability/session.gc_divisor che venga lanciato il garbage collector.
    Supponiamo 1 probabilità su 100, quindi

    session.gc_probability = 1
    session.gc_divisor = 100

    Quando viene lanciato il garbage collector, tutti i file di sessione creati nella data corrente meno session.gc_maxlifetime secondi vengono cancellati.

    Il punto quindi è questo:

    Se hai la durata di sessione di 10 minuti, mentre la durata del cookie a 20, non è detto che entro i 20 minuti la sessione sia stata effettivamente cancellata, perchè non è stato fatto scaturire il garbage collector, quindi avendo ancora l'id di sessione e essendo ancora presente il file riuscirai a vedere i dati anche se il tempo da te stabilito per il server è ampiamente scaduto.
    Questa è una cosa che è molto probabile capiti in locale, dove le richieste al server sono di numero ridotto.

    Spero di averci azzeccato :P

  10. #10
    @ gianiaz

    si, e' corretto. Ed e' per questo che ho suggerito il modo se non di cancellare il file di sessione, almeno di azzerarlo che e' poi quello che conta.

    meglio pero' aggiungere anche che:
    codice:
    ; NOTE: If you are using the subdirectory option for storing session files
    ;       (see session.save_path above), then garbage collection does *not*
    ;       happen automatically.  You will need to do your own garbage
    ;       collection through a shell script, cron entry, or some other method.
    ;       For example, the following script would is the equivalent of
    ;       setting session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes):
    ;          cd /path/to/sessions; find -cmin +24 | xargs rm
    personalmente metto i file di sessione in una cartella del sito e ad ogni login faccio partire uno script che mi cancella tutti i (miei) file di sessione scaduti.

    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 © 2024 vBulletin Solutions, Inc. All rights reserved.