Qual è lo stato dell'arte per forzare il logout sul browser per uscire?

7

Sfondo:

La maggior parte dei browser ha implementato una qualche forma di funzionalità di "ripristino di sessione" per gli utenti, laddove, se abilitati, i cookie di sessione verranno mantenuti durante i riavvii del browser.

  • Firefox ha "Mostra le mie finestre e le mie schede dall'ultima volta"
  • Chrome ha "Continua da dove eri rimasto"

I fornitori di browser hanno una posizione difendibile per mantenere queste funzionalità. Ciò impone agli utenti di configurare i propri browser "correttamente" e / o disconnettersi manualmente dai siti prima di uscire dal browser.

Domanda:

Per un sito che fornisce accesso a dati altamente sensibili E viene utilizzato in ambienti di elaborazione condivisi, quali sono le migliori pratiche per garantire che una sessione venga distrutta quando il browser è chiuso?

Le idee possibili includono:

  1. Ascolto di onbeforeunload eventi o simili e conteggio del numero di finestre aperte o schede. Quando il conteggio diventa 0, inviare un messaggio al server per invalidare la sessione. Ciò sembra problematico, a causa di: a) problemi di gestione degli eventi cross browser, e b) la navigazione fuori dal sito, intenzionale o accidentale, verrebbe trattata allo stesso modo in cui si chiude l'ultima scheda o finestra.
  2. Implementazione di un "heartbeat" nel codice client che una volta assente per un periodo di tempo invalida la sessione del server. Questo sembra anche impegnativo a causa di: a) latenza della rete che potrebbe causare logout falsi positivi, e b) alcuni browser che sospendono il codice JavaScript per le schede in background (o le applicazioni su dispositivi mobili).

Esistono altri approcci affidabili nelle varie piattaforme Web? Quali sono i siti Web di massima sicurezza attualmente attivi in questo spazio?

    
posta bsterne 24.12.2014 - 23:37
fonte

3 risposte

2

Il meglio qui sarebbe utilizzare una combinazione di cookie E ID di sessione rolling nell'URL (dove viene inserito un ID di sessione dopo la Query, come thisfile.php? sess = biskgndjkgnsldgsgdj) dove questo ID di sessione cambia con ogni richiesta.

Ciò garantisce che solo una scheda o una finestra del browser siano valide in un momento specifico.

Quindi usi il sistema Heartbeat. Il battito cardiaco può essere facilmente costruito per inviare 1 battito al 4 ° secondo, dando 15 battiti al minuto. E poi disconnetti l'utente sul lato server se TUTTI i beat sono assenti per un intero minuto.

15 battiti non verranno "ritardati o persi" a causa della latenza della rete. Se un singolo battito arriva alla destinazione, il timer viene resettato e consente di ripetere fino a 15 battiti mancanti.

Nota: NON È POSSIBILE impedire che le informazioni sensibili siano visibili nell'ultima finestra del browser visibile, poiché spesso si basano su informazioni memorizzate nella cache del client, anche se si utilizzano pragmi di no-cache e no-store. Ecco perché dovresti costruire l'interfaccia utente per richiedere un'azione separata per ogni apertura del set di dati sensibili. Inoltre, richiedendo un'azione separata, assicurati di poter registrare l'accesso a ciascun set di dati.

Esempio di applicazione di dati medici (cambiare per adattarsi alla tua applicazione): Diciamo che tu, in applicazione medica, puoi visualizzare l'indirizzo di un paziente, la storia di un paziente e le ultime 10 visite dei pazienti.

Invece di mostrare tutti i dati sulla stessa pagina, consentendo di inserire queste informazioni nella cache non autorizzata, è possibile ad esempio avere un pulsante per "rivelare l'indirizzo del paziente", un pulsante per "rivelare la storia della medicina" e un pulsante per "rivelare i pazienti" 10 ultime visite ", tutte queste fanno una richiesta al server.

Quindi, se l'utente dell'applicazione non preme mai "rivela indirizzo paziente", i dati anonimi medici verranno memorizzati nella cache sul client.

Se l'applicazione ha una sorta di registro delle transazioni contenente dati altamente sensibili, è meglio dividerlo in giorni, settimane, mesi o qualsiasi cosa sia adatta per quanto riguarda la frequenza degli eventi, quindi ogni blocco dei dati del registro deve essere aperto separatamente .

    
risposta data 25.12.2014 - 04:33
fonte
1

Dovrai tenere traccia del lato server dello stato sessione per questo, e scadere le sessioni che non hanno avuto alcuna attività entro l'ultimo X numero di secondi. Supponiamo che X sia 60 , il che significa che forzerai il logout in tutte le sessioni che non hanno avuto alcuna attività nell'ultimo minuto.

Se non vuoi che gli utenti siano disconnessi se non navigano verso un'altra pagina entro ogni minuto, potresti avere un keep-alive AJAX che farà una richiesta alla pagina. Suggerirei di utilizzare X/2 secondi per questo controllo per consentire la latenza della rete temporale. Quindi ogni 30 secondi di attivazione di AJAX, inviando il cookie di sessione al server che aggiornerà il tempo di last action registrato rispetto alla sessione con l'ora corrente del server.

È comunque possibile implementare un timer di inattività che scadrà la sessione se si dice che si ricevono 15 minuti di keep-alive AJAX ma nessuna richiesta manuale da parte dell'utente.

Alla fine della giornata, è necessario rendersi conto che questa è una situazione controllata dal cliente in modo da poterlo fare solo così lontano. Ad esempio, un utente può aggiornare automaticamente la pagina utilizzando un plug-in del browser per impedire il logout automatico.

some browsers suspending JavaScript code for backgrounded tabs (or applications on mobile).

Se questo è un problema, puoi aumentare il valore di X . Se l'applicazione è altamente sensibile, forse l'educazione degli utenti è la chiave. Insegna ai tuoi utenti che devono disconnettersi quando hanno finito di usare la tua applicazione. È possibile rilevare se gli utenti stanno scadendo o si disconnettono esplicitamente, e se è più spesso il primo è possibile visualizzare un messaggio importante sul proprio sito.

What are the highest-security websites currently doing in this space?

Esiste un modo molto sicuro, tuttavia questo dovrebbe essere implementato da zero all'interno della tua architettura di applicazioni web e non può essere semplicemente inserito. Qui gli ID di sessione sono collocati in campi di moduli nascosti invece di essere contenuti in un biscotto. Tuttavia, devono essere inviati da POST (vale a dire nel corpo della richiesta). L'utilizzo di questo in combinazione con il caching disabilitato impedirà il proseguimento di una sessione tra i riavvii del browser.

Lo svantaggio di questo approccio è che è necessaria un'azione di navigazione ogni per inviare un modulo.

Ad esempio potremmo avere un modulo per gestire la navigazione su ogni pagina costruita in questo modo:

<form method="post" action="/navigate">

    <input type="hidden" name="navigationPage" />
    <input type="hidden" name="sessionId" value="12345678" />

</form>

Con un clic all'interno della navigazione JavaScript verrà eseguito e impostato navigationPage sul valore appropriato (ad esempio myAccount , orderHistory , ecc.) e quindi inviare il modulo. L'URI /navigate verificherà sessionId e quindi passerà alla pagina specificata in navigationPage se la sessione è valida. Usando questo metodo ogni pagina all'interno della sessione di accesso avrà lo stesso URI ( www.example.com/navigate in questo caso).

Questo è più sicuro dell'aggiunta di un valore di stringa di query in quanto l'ID di sessione non sarà trapelato in referer di intestazioni nel caso di link esterni. I collegamenti esterni possono semplicemente collegarsi direttamente alla risorsa e non saranno il modulo POST utilizzato dalla navigazione interna.

Molti sistemi bancari utilizzano una tecnica simile per una protezione extra contro il dirottamento di sessione all'interno della sessione. In questi scenari, sessionId nel campo modulo nascosto verrà rigenerato su ogni caricamento di pagina che garantisce che solo un singolo browser Web stia navigando contemporaneamente. Tuttavia, ciò impedirà l'utilizzo del pulsante Indietro perché impone una nuova presentazione dei dati POST o l'apertura di collegamenti in schede separate del browser, in quanto l'ID rolling non verrà aggiornato in entrambe le posizioni. Questo è spesso usato in combinazione con i cookie di sessione, ma può essere usato in isolamento. Le azioni che richiedono informazioni aggiuntive come i trasferimenti di denaro possono semplicemente includere campi di moduli aggiuntivi da inviare con il modulo principale.

Un altro vantaggio di questo approccio è che è intrinsecamente sicuro contro CSRF . Se un'altra pagina effettua una richiesta cross site, mancherà il sessionId perché non verrà inviata automaticamente allo stesso modo dei cookie.

Questo può anche essere implementato in HTML solo senza JavaScript, dove ogni pulsante sulla pagina invierà un ID di navigationPage .

Questo approccio significa che puoi anche mantenere il timeout della sessione corrente e non è necessario un battito cardiaco.

    
risposta data 29.12.2014 - 18:28
fonte
0

Ad eccezione del supporto delle versioni precedenti di Internet Explorer, ciò che farei è utilizzare la memoria Web per archiviare gli stati di grandi applicazioni sul lato client e consentire al JavaScript di caricare i dati.

Lo spazio web offre molto più spazio intorno ai 5 MB rispetto ai cookie, ma utilizzerei anche i cookie per memorizzare il token di autenticazione.

    
risposta data 26.12.2014 - 18:56
fonte

Leggi altre domande sui tag