Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di Trinità76
    Registrato dal
    Jan 2002
    Messaggi
    1,439

    [php4] autenticazione con sessioni e mysql

    Salve a tutti,
    potreste dirmi se il procedimento che sto usando è giusto (o comunque se non sto facendo errori madornali) per favore?
    Premetto di aver letto la pillola in rilievo e anche il manuale di php.net

    Dunque il sito che ho è strutturato in questo modo:
    codice:
    pagina_semplice -> una pagina qualsiasi del sito in cui non è richiesto l'accesso con user/psw
    pagina_di_login -> nel mio caso la pagina di login corrisponde anche a quella di logoff
    pagina_login_check -> pagina di verifica dati
    pagina_riservata1 -> pagina in cui devo verificare l'autenticazione
    pagina_riservata2 -> come sopra...
    Ho fatto un database così strutturato:
    codice:
    CREATE TABLE `users_online` (
      `uso_id` int(10) NOT NULL auto_increment,
      `uso_ip` varchar(15) NOT NULL default '',
      `uso_timestamp` varchar(15) NOT NULL default '',
      `uso_session_id` varchar(255) NOT NULL default '',
      `uso_usr_id` int(10) default '0',
      PRIMARY KEY  (`uso_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1
    In tutte le pagine del sito c'è una classe che scrive in questo database se ci sono utenti che stanno visualizzando le pagine: nel caso in cui la pagina sia di tipo pagina_semplice la classe scrive solo l'ip e timestamp; nel caso in cui sia una pagina_riservata scrive anche il session_id e l'user_id.

    Ed ecco essenzialmente come ho strutturato il codice:
    pagina_di_login:
    Codice PHP:
    // sloggo
    session_start();
    if( 
    $_SESSION['logged'] ) {
        
    session_unset();
        
    $_SESSION = array();    // Desetta tutte le variabili di sessione.
        
    session_destroy();        // Infine distrugge la sessione.
    }

    $visitors_online = new usersOnline$connDATABASENAME ); // scrivo nel db l'utente on line 
    pagina_login_check:
    Codice PHP:
    // verifico i dati
    // [...]
    // sessione
    session_start();
    session_register('logged'); $_SESSION['logged'] = $usr_id;
    // scrivo l'utente online, stavolta inserendo anche gli altri 2 parametri
    $visitors_online = new usersOnline$connDATABASENAMEsession_id(), $usr_id ); 
    pagina_riservata:
    Codice PHP:
    // includo la verifica dell'autenticazione 
    // della sessione in tutti i files
    require_once "includephp/sess.php";

    // questo file sess.php contiene essenzialmente:
    //----------------------------//
    session_start();
    if( !
    session_is_registered'logged' ) || session_id() =='' ) { header'Location: pagina_di_login.php'false ); exit; }

    // tramite la classe verifico nel database l'userid precedentemente
    // inserito tramite l'id di sessione
    $usr_id usersOnline::retreive_useridsession_id() );

    // dopodicchè scrivo che l'utente è online
    $visitors_online = new usersOnline$connDATABASENAMEsession_id(), $usr_id );

    // infine recupero i suoi dati
    $ris = &mysql_query'SELECT users.*, ( usr_id = '.intval$usr_id ).' ) AND ( flag &1 );' ) or die( 'stop' );
    if( 
    mysql_num_rows$ris ) != ) {
        
    session_unset();                
        
    session_destroy();
        
    header'Location: pagina_di_login.php'false ); exit;
    }
    $row mysql_fetch_row$ris );
    //----------------------------// 

    Tutto sembra funzionare discretamente:
    esempio: eseguo il login -> pagina di controllo -> vengo reindirizzato nell'area riservata -> sloggo andando alla pagina di login -> scrivo manualmente nell'url la pagina riservata (senza reinserire i dati user/psw) -> vengo reindirizzato alla pagina di login.

    Fin qui tutto ok... ma c'è qualcosa che non mi torna.
    Quanto faccio gli unset e destroy sessione, le variabili di sessione vengono distrutte ma il session_id rimane lo stesso anche se uso session_regenerate_id(), sembra rimanere lo stesso...

    ...pensavo di basarmi su di esso per fare controlli più sicuri...

    qualcuno saprebbe aiutarmi a capire dove sbaglio?
    わさび

  2. #2
    il session_id ha due scadenze. una lato client alla chiusura del browser (il default) ed una lato server per timeout di inattivita'. Viene letto per quest'ultimo la data ora ultima modifica del file di sessione.
    Non ha alcuna importanza l'id di sessione usato, basta che il contenuto della sessione sia stato eliminato. l'id identifica client (browser) - dati di sessione

    Un paio di appunti...

    nella pagina di login.php dovresti usare isset() oppure empty() per evitare un NOTICE nel caso di $_SESSION['logged'] non ancora valorizzato.

    Non usare session_register() se utilizzi $_SESSION. Questo e' sempre registrato. vedi il manuale php.

    http://www.php.net/manual/it/ref.session.php

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

  3. #3
    Utente di HTML.it L'avatar di Trinità76
    Registrato dal
    Jan 2002
    Messaggi
    1,439
    Ho fatto le modifiche che mi hai suggerito:
    Ho usato isset() nella pagina login e ho messo direttamente $_SESSION['var'] nella pagina check_login senza usare session_register(). Per il resto il procedimento ti sembra ok?
    わさび

  4. #4
    Originariamente inviato da Trinità76
    Ho fatto le modifiche che mi hai suggerito:
    Ho usato isset() nella pagina login e ho messo direttamente $_SESSION['var'] nella pagina check_login senza usare session_register(). Per il resto il procedimento ti sembra ok?
    nel caso che tu decida di distruggere la sessione dovresti sempre anche distruggere l'array $_SESSION.... (ultima parte del tuo script) proprio perche' come hai visto se il cliente rilancia l'url il suo cookie di sessione continua ad essere valido e riesumerebbe la sessione con lo stesso id teste' distrutta....

    Salvaguarda il contenuto piu' che il session_id# che tra l'altro puoi sempre cambiare nel caso del check fallito...

    vedi session_regenerate_id() ... puoi sempre spiazzare il cookie del browser cambiando l'id di sessione.

    Per il funzionamento in se che dire... bisogna provare da diversi browser, da stessi browser con differenti finestre o/e schede per verificare il comportamento sul mantenimento della validita' di sessione. L'uso del database per verificare i dati di sessione puo' anche essere valido ma non ti da nulla in piu', serve per statistica. Mi lascia perplesso l'associazione ip/session_id.... potrebbe cambiare l'ip senza chiudere il browser per down della rete per esempio ... ripeto bisognerebbe provare.... l'idea e' comunque buona.

    Piuttosto prenderei in considerazione il completo passaggio della gestione delle sessioni su db.


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

  5. #5
    Originariamente inviato da piero.mac

    Piuttosto prenderei in considerazione il completo passaggio della gestione delle sessioni su db.

    ciao piero.mac

    dove posso leggere qualcosa in merito o trovare qualche esempio?
    aquatimer2000

  6. #6
    Originariamente inviato da aquatimer2000
    ciao piero.mac

    dove posso leggere qualcosa in merito o trovare qualche esempio?
    tieni presente che l'articolo di gm potrebbe gia' iscriversi a scuola..... visto la data...

    http://php.html.it/articoli/leggi/87...native-in-php/

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

  7. #7
    diciamo che sono proprio messo male...ho capito poco o niente... in particolare:

    in un sistema di autenticazione con sessioni (gestite senza database), in linea di massima proteggo un file verificando se sono settate una o più variabili di sessione (che "registro" dopo aver verificato l'esistenza dell'accopiata user/password nella relativa tabella degli utenti). Se le variabili di sessione sono settate, posso leggere il contenuto del file, altrimenti vengo rispedito alla pagina di login in quanto significa che le mie credenziali non sono ancora state verificate.
    giusto?

    nel caso in cui le variabili di sessione vengano salvate su una tabella di un database, avente i seguenti campi:

    id,SID,variabili

    come faccio a proteggere uno (o più) file ?

    devo eseguire una query che verifichi l'esisitenza di una riga avente come valore il SID della sessione?

    Scusa la mia ignoranza brancolo nel buio!
    aquatimer2000

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.