Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    (php4) problemi con session_regenerate_id

    ciao a tutti, un quesito su un argomento i cui meccanismi a volte mi sfuggono: le sessioni.

    Qual è esattamente il funzionamento di session_regenerate_id()?


    ----
    RETTIFICO IL POST (leggere sotto): in realtà non funziona affatto: se utilizzo questa funzione le variabili di sessione non vengono salvate. Utilizzo i cookies di sessione e le funzioni OB_*
    ----



    Lo chiedo perchè ho provato ad inserirlo in uno script come ulteriore sicurezza, utilizzando questo codice reperito online:

    Codice PHP:
    if (!isset($_SESSION['SERVER_GENERATED_SID'])) {
       
    session_destroy(); // destroy all data in session
    }
    session_regenerate_id(); // generate a new session identifier
    $_SESSION['SERVER_GENERATED_SID'] = true
    In sostanza ad ogni pagina dovrebbe rigenerarsi l'ID rimanendo intatti i dati.

    Il codice ovviamente funziona nelle transizioni da una pagina e l'altra tramite links, ma utilizzandolo in un contesto dove al submit di un form Post vengono processati i dati e subito reindirizzato l'utente tramite un Header Location, pur utilizzando il comando session_write_close() ho notato che le modifiche alla sessione non vengono affatto salvate se si rigenera l'ID (che in realtà è rigenerato 2 volte prima della nuova pagina mostrata all'utente); mentre il funzionamento è ok, se anche dopo il redirect mantengo lo stesso ID.

    E' un comportamento voluto o qualcosa mi sfugge?

    Grazie.

    ciao,
    jack.

  2. #2
    invece di session_destroy() che presume di chiudere la sessione per effettuare la distruzione dei dati di sessione, prova ad usare il sempiterno ed efficace:

    $_SESSION = array();

    e poi rigeneri l'id di sessione e ricostruisci $_SESSION

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

  3. #3
    sì infatti utilizzo session_unset(), ma il problema è che non funziona affatto. facendo altre prove, se utilizzo regenerate, le variabili scritte in quella pagina (non quelle già in sessione) non vengono salvate affatto.
    la sessione viene preservata (io voglio solo cambiare l'id, mantenendo i dati - sempre se ha senso farlo, magari ditemi).

  4. #4
    Originariamente inviato da mdsjack
    sì infatti utilizzo session_unset(), ma il problema è che non funziona affatto. facendo altre prove, se utilizzo regenerate, le variabili scritte in quella pagina (non quelle già in sessione) non vengono salvate affatto.
    la sessione viene preservata (io voglio solo cambiare l'id, mantenendo i dati - sempre se ha senso farlo, magari ditemi).
    Non ti spieghi.

    Se cambi il session_id cambi il riferimento della sessione. Viene inviato un cookie al client con il nuovo session_id da utilizzare. Morale.... l'utente accede ad un altro file di sessione ed i dati precedenti vanno tutti persi. Se vuoi preservare i dati che senso ha cambiare solo l'id di sessione... cambi file e trovi la stessa roba.

    Dove potrebbe essere utile? un esempio:

    l'utente raggiunge la fine degli accessi previsti. Gli cambi il session_id e' lui si trova nell'impossibilita' di riutilizzare il vecchio cookie e di concerto gli stessi dati di sessione precedenti.

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

  5. #5
    Utente di HTML.it L'avatar di dararag
    Registrato dal
    Jan 2008
    Messaggi
    434
    scusate, ma se avete letto il titolo dice php4, ma nel php4 la funzione regenerate_id non c'era, o sbaglio?

  6. #6
    Originariamente inviato da dararag
    scusate, ma se avete letto il titolo dice php4, ma nel php4 la funzione regenerate_id non c'era, o sbaglio?
    controlla sul manuale...

    http://it2.php.net/manual/it/functio...enerate-id.php

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

  7. #7
    Dunque: nell'intento di migliorare la sicurezza delle sessioni ho trovato quel semplice codice, che se trova una sessione con un id arbitrario, lo rimpiazza cancellando i dati, e mettendo un flag che dice che l'id è legittimo.
    Ora, dando per presupposto che è un buon trucchetto (confermatemelo voi), come si vede dal codice, l'id viene rigenerato COMUNQUE ad ogni pagina, per cui, se in un primo momento i dati di sessione finti vengono cancellati, dopo è ovvio che quelli nuovi, autentici, rimangono, dovendo solo aggiornarsi l'id di sessione, per evitare che possa essere rubato.

    Se questo è giusto ed è utile, passiamo alla parte tecnica: non funziona una cippa. se io scrivo una variabile di sessione nella stessa pagina dove rigenero l'id, nella pagina dopo quella variabile non viene scritta, mentre viene scritta se commento la riga con la rigenerazione, ovvero se mantengo lo stesso id.

    C'è qualcosa che mi sfugge?

  8. #8
    forse sfugge qualcosa a me....

    gli esempi valgono piu' di mille parole:

    file pag1.php
    Codice PHP:
    <?php
    session_start
    ();
    echo 
    "quando entro l'array _SESSION è: <pre> ";
    print_r($_SESSION);

    if(empty(
    $_SESSION)) echo "L'array di sessione è vuoto";
             else echo 
    "l'array _SESSION non è vuoto";

    // valorizzo la sessione con i miei dati
    if(!empty($_SESSION['check']) )
    {  unset(
    $_SESSION['check']);   }

    $_SESSION['nome'] = 'Piero.mac';
    $_SESSION['ssid'] = session_id();

    echo 
    "

    *****************************

          Dopo la valorizzazione l'array è:
    <pre>"
    ;
    print_r($_SESSION);
    ?>

    <a href = "pag2.php"> vai a pag. 2</a>
    file pag2.php
    Codice PHP:
    <?php
    session_start
    ();
    echo 
    "<pre>";
    print_r($_SESSION);

    // pulisco la sessione
    $_SESSION = array();

    //cambio l'idi di sessione
    session_regenerate_id();

    // riscrivo _SESSION con dati nuovi
    $_SESSION['nome'] = 'mdsjack';
    $_SESSION['ssid'] = session_id();

    ?>
    <a href = "pag3.php"> vai a pag. 3</a>
    file pag3.php
    Codice PHP:
    <?php
    session_start
    ();
    echo 
    "<pre>";
    print_r($_SESSION);

    //aggiungo un dato tanto per... 
    $_SESSION['check'] = 'cambiato = yes';
    ?>
    <a href = "pag1.php"> vai a pag. 1</a>
    a me pare faccia esattamente quanto richiesto....

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

  9. #9
    Mah.... a me l'id non cambia affatto, però salva i valori. Il contrario di quello che lamentavo all'inizio:

    Pag1:

    codice:
    quando entro l'array _SESSION è: 
     Array
    (
    )
    L'array di sessione è vuoto***************************** 
          Dopo la valorizzazione l'array è:Array
    (
        [nome] => Piero.mac
        [ssid] => 8ca17436c94dbb85b598bf57ab9cb230
    )
     
    
     vai a pag. 2

    Pag2:

    codice:
    Array
    (
        [nome] => Piero.mac
        [ssid] => 8ca17436c94dbb85b598bf57ab9cb230
    )
     
     vai a pag. 3
    Pag3:

    codice:
    Array
    (
        [nome] => Piero.mac
        [ssid] => 8ca17436c94dbb85b598bf57ab9cb230
    )
     
     vai a pag. 1
    Pag1 di nuovo:

    codice:
    quando entro l'array _SESSION è: 
     Array
    (
        [nome] => Piero.mac
        [ssid] => 8ca17436c94dbb85b598bf57ab9cb230
        [check] => cambiato = yes
    )
    l'array _SESSION non è vuoto***************************** 
          Dopo la valorizzazione l'array è:Array
    (
        [nome] => Piero.mac
        [ssid] => 8ca17436c94dbb85b598bf57ab9cb230
    )
     
    
     vai a pag. 2

    Ecco cosa vedo io...

  10. #10
    butta il pc....

    vediamo che succede a me?

    pag1.php
    codice:
    quando entro l'array _SESSION è:
    
     Array
    (
    )
    L'array di sessione è vuoto
    
    *****************************
    
          Dopo la valorizzazione l'array è:
    
    Array
    (
        [nome] => Piero.mac
        [ssid] => ehk6vqpl229lkr6970fa1958m5
    )
    
     vai a pag. 2
    pag2

    codice:
    Array
    (
        [nome] => Piero.mac
        [ssid] => ehk6vqpl229lkr6970fa1958m5
    )
     vai a pag. 3
    pag3
    codice:
    Array
    (
        [nome] => mdsjack
        [ssid] => 1ls7fmp3mfjpcc0c64ndcqgh31
    )
     vai a pag. 1
    torno a pag1
    codice:
    quando entro l'array _SESSION è:
    
     Array
    (
        [nome] => mdsjack
        [ssid] => 1ls7fmp3mfjpcc0c64ndcqgh31
        [check] => cambiato = yes
    )
    l'array _SESSION non è vuoto
    
    *****************************
    
          Dopo la valorizzazione l'array è:
    
    Array
    (
        [nome] => Piero.mac
        [ssid] => 1ls7fmp3mfjpcc0c64ndcqgh31
    )
    
     vai a pag. 2
    cosi' e' e cosi' deve essere.

    se la tua versione del php fosse antecedente la 4.3.2 allora non avresti a disposizione la funzione per il cambio del session_id ma avresti la segnalazione dell'errore (funzione inesistente)

    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.