Gestione dei timeout della sessione in relazione all'attività dell'utente nella pagina

3

Quindi creerò una funzionalità per un'applicazione php che effettua le seguenti operazioni:

  • Crea una sessione che scade dopo 30 minuti.
  • Dopo 30 minuti, se non c'è attività dell'utente nell'applicazione (inclusa la digitazione su una casella di testo, spostando un mouse su tutta la pagina), la sessione verrà distrutta e il sistema si reindirizzerà a una pagina di disconnessione (logout.php ). Quello che intendo per tastiera / mouse è solo specifico per il sistema, se il sistema è aperto mentre sto facendo altre cose al di fuori del sistema, il sistema dovrebbe considerarlo idolo.
  • Se la sessione ha momenti da vivere (circa 15 secondi) e c'è attività dell'utente, la durata della sessione sarà estesa a 30 minuti. Il motivo è che se un utente sta inserendo informazioni critiche, sarebbe molto scomodo registrarlo prima di inviare il modulo. Questo è il motivo per cui i movimenti della tastiera e del mouse dovrebbero essere rilevati dal sistema.

Ho trovato due soluzioni possibili, ma non ne sono soddisfatto.

Prima soluzione

Utilizzerò quasi javascript per tutto.

  • Gestisci la sessione o il cookie (non sono sicuro che javascript riconosca le sessioni lato server)
  • Rileva attività tastiera / mouse
  • Estendi la durata della sessione / cookie
  • Reindirizza a logout.php per distruggere la sessione

Credo che questa soluzione sia estremamente negativa. Credo che ci siano modi per manipolare il codice javascript per cambiarlo (per impedire il reindirizzamento a logout.php, per esempio). Cioè, sto facendo un processo che dovrebbe essere fatto sul server.

Seconda soluzione

  • usa javascript per rilevare l'attività di tastiera / mouse come prima.
  • 15 secondi prima dei 30 minuti, dovrò inviare una richiesta Ajax a una pagina php. La richiesta Ajax contiene le informazioni relative all'esistenza di attività dell'utente durante questo periodo.
  • Ora questa particolare pagina php gestisce le informazioni inviate da ajax. Se viene rilevata l'attività dell'utente, php estende solo la durata della sessione. Altrimenti deve reindirizzare a logout.php tramite la funzione .done di ajax o attraverso altri mezzi.

Non penso che i processi che ho descritto sopra siano buone soluzioni. In particolare l'uso pesante di javascript per fare cose lato server. Il mio problema è che non riesco a trovare un modo per rilevare i movimenti della tastiera / mouse utilizzando php. Tutto ciò che ho trovato su come farlo è usando javascript (comprensibilmente visto che le azioni dell'utente sono fatte nel browser e non nel server).

Come devo procedere? Quale sarebbe la soluzione migliore e più sicura?

    
posta morbidCode 16.11.2016 - 16:06
fonte

2 risposte

4

La tua seconda soluzione è la soluzione migliore. Credo questo perché dovrebbe essere fondamentalmente responsabilità dei clienti informare il server che sono ancora attivi. Il server può quindi fare come deve da lì.

Questo dà al server tutto il controllo su ciò che accade. L'unico controllo che ha il client è di designare se l'utente è ancora attivo o meno. Quale è una relazione client / server corretta.

    
risposta data 16.11.2016 - 17:25
fonte
3

Non devi fare affidamento su Javascript come unica soluzione. Il PHP dovrebbe tracciare la scadenza della sessione con la classe Javascript che gestisce gli aggiornamenti sulla pagina. Se non ci sono aggiornamenti da JS, il PHP dovrebbe scadere automaticamente la sessione alla richiesta successiva. Ci sono molti motivi per cui il JS non aggiorna la pagina, incluso il computer, la rete scollegata e il raro caso in cui il browser abbia disabilitato il javascript.

La chiamata AJAX sarebbe solo qualcosa come una richiesta keep-alive, con la risposta sia OK, o "quale sessione?".

Per la soluzione n. 1, non farei il ping del server per ogni azione dell'utente, e se seguirai questa strada farei attività di gruppo e manderei solo un ping ogni 3-5 minuti (che c'era qualche attività dell'utente all'interno del ultimi 3-5 minuti).

Qualunque soluzione tu scelga, assicurati di gestire il fatto che gli utenti potrebbero potenzialmente avere più finestre / schede del browser aperte ... e che AJAX da una finestra non dovrebbe cancellare la sessione perché non c'è attività su quella finestra.

    
risposta data 17.11.2016 - 20:07
fonte

Leggi altre domande sui tag