Visualizzazione risultati 1 fino 5 di 5
Like Tree2Likes
  • 1 Post By dreadnaut
  • 1 Post By dreadnaut

Discussione: PHP - Sessioni

  1. #1
    Guest

    Predefinito PHP - Sessioni

    Salve ragazzi,
    sto studiando le sessioni in php e ho bisogno di risolvere un problema che ho:

    Il tutto parte da un'applicazione per smartphone che manda richieste get e post ad una mia pagina web php.


    Ho un utente che si logga su un sito, creando una sessione.
    Dopo essersi loggato correttamente, l'utente avvia una sessione e un flag su un db viene messo a true per indicare che l'utente è collegato, viceversa è offline.

    Il mio problema è che se per sbaglio l'applicazione dovesse crashare, non riesco a mandare al server la richiesta di logout, ma la sessione rimane aperta giusto? nel senso, se non supera il suo timeout dovrebbe rimanere salvata.

    Come faccio a far mettere il flag sul db a 0 allo scadere della sessione? Ho visto che si possono implementare interfacce che permettono l'uso personalizzato del salvataggio delle sessioni, il che mi ha incoraggiato ad usarle... ma il problema rimane...

    E' importante che un utente non possa loggarsi due volte contemporaneamente, per cui per un terminale esiste un unico utente ed un'unica sessione.

    Inoltre, dovendo mandare username e password tramite richiesta get/post, l'unica possibilità per indicare che un utente debba effettuare il logout è mandare una richiesta del tipo:

    http://www.example.com/?request=logo...sword=Password.

    Ed è qui che mi servono le sessioni, perchè se chi ha effettuato tale richiesta non possiede la stessa sessione di chi effettivamente ha effettuato il login, la richiesta viene rifiutata.

  2. #2
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,306

    Predefinito

    Un flag binario non è informazione sufficiente: quello che ti serve nel database è l'ora (timestamp) a cui l'utente ha effettuato l'ultima richiesta al server, chiamalo T. Quando ora_corrente - T è maggiore della durata che vuoi dare alla tua sessione, puoi considerare la sessione chiusa e l'utente sloggato.

    Eliminato il problema del settare il tuo flag a zero, è probabile che non ci siano altre azioni che devi eseguire al momento del logout, e quindi ricadi nel caso delle normali sessioni php. (Se ci sono, stai probabilmente salvando troppo stato nella sessione, roba che dovrebbe andare nel database)

    Occhio anche che passare nome è utente e password via GET è la peggior pratica, perché queste appariranno in chiaro nella cronologia del browser e nei log di qualsiasi server o proxy fra il browser ed il sito web. (POST è meglio, anche se sempre in chiaro, https è crittato)
    FrancescoRizzi likes this.

  3. #3
    Guest

    Predefinito

    Ti ringrazio ancora per la risposta, dreadnaut... Tuttavia ho da chiederti alcune cose:


    Quando ora_corrente - T è maggiore della durata che vuoi dare alla tua sessione, puoi considerare la sessione chiusa e l'utente sloggato.
    Se la condizione che dici si verifica quando lo stesso utente entra nuovamente, il flag non può essere rimesso a 0.

    Inoltre, senza l'utilizzo di questo flag, non saprei come impedire che da un altro terminale, con le stesse credenziali, si possa accedere allo stesso account.

  4. #4
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,306

    Predefinito

    Citazione Originalmente inviato da FrancescoRizzi Visualizza messaggio
    Se la condizione che dici si verifica quando lo stesso utente entra nuovamente, il flag non può essere rimesso a 0.
    Se non c'è alcun flag, cosa rimetti a zero? Puoi spiegarti meglio?

    Inoltre, senza l'utilizzo di questo flag, non saprei come impedire che da un altro terminale, con le stesse credenziali, si possa accedere allo stesso account.
    L'esistenza di una sessione valida per un utente deve prevenire ulteriori login per lo stesso utente. L'unica cosa che cambia è che invece di guardare un flag binario ($is_logged == true) confronti l'ultimo accesso con la durata massima di una sessione ($ts_adesso - $ts_ultima_richiesta < DURATA_SESSIONE).

    Il mio istinto phposo mi dice però che ti stai complicando la vita. Quali sono i requisiti di questa cosa? Perché e con quali parametri devi bloccare login diversi? Come vuoi gestire casi come "l'utente cambia browser o device" ?
    Ultima modifica di dreadnaut : 12-06-2016 alle ore 22.29.42
    mzanella likes this.

  5. #5
    Guest

    Predefinito

    Ciao Dreadnaut, scusa il ritardo.

    Dunque... Attualmente ho "risolto" così:

    Ogni utente, loggato o meno, ha una sessione, che può essere distrutta o meno in base alle azioni compiute.

    Ho lasciato il flag sul db che, come ti dicevo, mi permette di sapere se un utente è già loggato o meno.

    Non utilizzo la sessione, sul db, perchè in caso di crash, la sessione dell'utente rimarrebbe ancora attiva e nessuno potrebbe entrare nell'account, se non l'utente stesso, tramite l'sid.

    Parlando di SID. Questo viene passato tramite richiesta POST, e escludendo https, credo sia l'unica opzione per rendere ciò un po' più sicuro, al massimo provvederò a criptare i messaggi della comunicazione, ma la sicurezza non è un vincolo importante per ciò che sto facendo, se non una soddisfazione in più.

    Ogni utente, riceverà dal server l'id della sessione, che utilizzerà SEMPRE per accedere alla propria sessione. Quindi, in caso di crash, io UTENTE mario rossi, posso accedere alla mia sessione salvata come "sess_MarioRossi" tramite l'id "MarioRossi" che ho ricevuto dal server al momento del login, e che ho provveduto a salvare.

    In questa maniera solo io sono autorizzato ad entrare nel mio account, con o senza avvenimento di crash, perchè solo io so l'id della mia sessione. E' ovvio che se mi rubano l'sid, mi rubano l'account.

    L'unico problema potrebbe essere quello di perdere l'id identificativo, e quindi essere costretti ad aspettare che la sessione scada, per generarne una nuova valida... Per questo, però, non posso avere tempi di scadenza molto lunghi, se non di 10/15 minuti.

    Spero di averti reso più chiaro il quadro della situazione :).

    Se hai consigli, o soluzioni più valide, anche a livello di sicurezza (considerando che sono alle primissime armi col web e php) queste sono ben accette.

    Ciao e buonagiornata!
    Ultima modifica di FrancescoRizzi : 13-06-2016 alle ore 22.08.09

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •