Mantenere viva la sessione utente - considerazioni sulla sicurezza

9

Abbiamo recentemente sviluppato alcune funzionalità per la nostra app Web per consentire a un utente di rimanere connesso a tempo indeterminato, e sono interessati a conoscere le implicazioni sulla sicurezza di farlo. L'obiettivo era prevenire la perdita dei dati degli utenti se impiegavano troppo tempo per modificare una pagina, in precedenza dovevano copiare / incollare negli appunti una volta scaduta la sessione, poiché i POST venivano bloccati e l'accesso veniva gestito su una schermata diversa .

Quindi, ora rileviamo se una sessione utente è prossima alla scadenza e quindi li presenta con una modale che consente loro di fare clic su un pulsante per mantenere viva la sessione. Se ignorano questa modal di avviso per un periodo abbastanza lungo, la sostituiamo con una modal "log-in" appena la loro sessione scade.

Il primo meccanismo di avviso / modal funziona tramite una chiamata AJAX al server che restituisce il tempo fino alla disconnessione. Se il tempo è inferiore a 15 minuti apriamo il modal "Keep me logged in" che ha due opzioni: disconnettimi ora o resta loggato. Disconnettiti fa l'ovvio, rimanendo loggato, un altro AJAX arriva al server di nuovo aggiorna i cookie di autenticazione dell'utente.

Il secondo modal è più complicato - il modale blocca ulteriormente l'interazione con la pagina e viene rimosso solo dopo il rientro corretto della password. Siamo consapevoli che una modale non proteggerà veramente i dati di lettura dalla pagina, ma questa è la natura del requisito.

I dati richiesti all'utente per il nuovo accesso (come nome utente e ruolo precedente) sono memorizzati in testo normale nei campi di input nascosti all'interno del modale. Abbiamo preso in considerazione l'hashing, ma non sembrava necessario: il nome utente non è particolarmente critico e il ruolo richiesto viene rivalutato al nuovo accesso; non è possibile eseguire l'upgrade a un ruolo a cui non si ha accesso se si è tentato di "regolare" il POST.

Lo scenario peggiore che abbiamo considerato è che qualcuno modifica il POST con un nome utente / password diverso ma valido e accede come qualcun altro rimanendo sulla pagina. Sarebbero in grado di leggere la pagina ma possono farlo comunque: la navigazione in uscita li riporterà agli schermi corretti per il "nuovo" login. Probabilmente abbiamo bisogno di un po 'di lavoro per garantire che tutti i POST siano bloccati in questo scenario, ma c'è qualcos'altro da considerare? C'è qualcosa da guadagnare costringendo l'utente a ri-identificare digitando di nuovo manualmente il proprio nome utente?

L'app Web è ASP.NET MVC3.

Aggiorna

Grazie per il feedback finora.

Abbiamo accettato di non fidarsi dei dati del client, quindi abbiamo deciso di crittografare il nome utente e il ruolo insieme e quindi lo decodifichiamo al tentativo di accesso. Da allora abbiamo scoperto che, a causa delle protezioni AntiForgeryToken che abbiamo già in vigore se un altro utente doveva effettuare il login, qualsiasi azione post non avrebbe avuto esito positivo.

Non riteniamo che ci sarà un grosso problema di usabilità con il popup poiché il timeout è attualmente impostato su 60 minuti con un avviso di 15 minuti. Abbiamo già preso in considerazione la scadenza di scorrimento non aggiornata fino a metà strada (http://msdn.microsoft.com/en-us/library/system.web.configuration.formsauthenticationconfiguration.slidingexpiration.aspx). È importante ricordare che tutto questo è stato implementato per affrontare i reclami degli utenti sulla perdita di dati - inseriscono una grande quantità di testo sul nostro sistema che può richiedere molto tempo e ha un'alta probabilità che la sessione vada in stallo prima che siano finiti.

Un'altra funzione da aggiungere in un secondo momento sarebbe gestire un utente che modifica i campi di input e invia un heartbeat al server (a meno che non siano già non autenticati). Non abbiamo ancora deciso come gestire questo evento o per attivare l'heartbeat in modo che non spari ogni keypress. Una volta che questo è a posto la finestra di dialogo di avviso di timeout dovrebbe mostrare meno spesso.

Qualcos'altro che vale la pena menzionare è che l'intero sito è HTTPS e usiamo ASP.Net AntiForgeryToken che sono HttpOnly Cookie contrassegnati come sicuri.

Se qualcuno ha ulteriori commenti o suggerimenti sarebbe bello sentirti.

    
posta user15895 12.11.2012 - 12:08
fonte

2 risposte

4

Sento due "cattivi odori" in questo approccio:

  • Innanzitutto, non dovresti mai fidarti del client. Memorizzare il nome utente sul lato client e quindi fidarsi del client per rimandarlo onestamente non mi sembra saggio. Hai già scoperto che questo potrebbe consentire a qualcuno di accedere a una singola pagina con un nome utente diverso. Sembra già un po 'dubbio, e come fai a sapere che non ci sono attacchi peggiori? Suggerirei contro qualsiasi schema che coinvolga la fiducia, anche se solo per poco tempo, nel client.

  • In secondo luogo, l'usabilità di questo sembra problematica. Aprire finestre di dialogo che interrompono il flusso è davvero fastidioso. O tagliare la sessione o non farlo. Personalmente, per la maggior parte dei siti web ritengo che non ci sia molto pericolo nel tenere aperta la sessione per un lungo periodo, se hanno lasciato una scheda aperta, e penso che i vantaggi dell'usabilità di non costringere gli utenti a riconnettersi valgono i rischi per la sicurezza ma è questo che devi decidere. Il mio unico suggerimento è di evitare finestre di dialogo pop-up che interrompono il flusso. Certo, non sono un esperto di usabilità. Se desideri un parere più esperto, puoi chiedere su User Experience.SE .

    Aggiornamento (11/14) : capisco che tu abbia aggiunto la finestra di dialogo per un motivo, ma continuo a pensare che probabilmente non è la soluzione migliore dal punto di vista dell'usabilità. Se la soluzione è che gli utenti che si trovavano nel mezzo dell'inserimento dati stavano perdendo dati, allora ci sono altre soluzioni che sembrano avere una migliore usabilità. Esempio: puoi usare Javascript per fare in modo che l'applicazione web salvi automaticamente il testo che hanno inserito ogni 30 secondi, in modo che se la loro sessione scade, possono riaccedere e il loro testo riappare. Oppure, è possibile prolungare la durata della sessione. In alternativa, è possibile rilevare l'attività dell'utente in qualsiasi scheda (digitando, ecc.) E scadono la sessione solo dopo 60 minuti di inattività dell'utente. Chiedere alla gente l'esperienza degli utenti potrebbe portare anche ad altri suggerimenti. Mi rendo conto che questo è fuori tema per questo sito, quindi lascerò perdere.

Non ho immediatamente un attacco che rompe il tuo schema e lo distrugge a nastri. Ma questi "cattivi odori" mi lasciano un po 'preoccupato e mi fanno pensare che non hai seguito le buone pratiche per la progettazione difensiva nelle applicazioni web.

    
risposta data 12.11.2012 - 18:57
fonte
2
  • Mantenere viva la sessione utente. Per quanto riguarda il carico, è tutto qui il tuo hardware e come lo scrivi, ma non ha alcun effetto peggiore di utenti che aggiornano la pagina (probabilmente meno considerando il sovraccarico di una chiamata AJAX su un caricamento di pagina standard).
  • Puoi regolare il timeout in web.config se è quello che sei chiedendo ...
  • I cookie hanno il loro scopo e li trovo accettabili a patto che è il tuo dominio, ma renditi conto che alcune persone li disabilitano e così via si riduce ad avere un ripiego
  • Ci sono postback lato server quando si usa .NET AJAX con UpdatePanel. L'unica differenza è che l'intera pagina non lo è caricato. Tutto il codice lato server viene attivato normalmente, ma il le informazioni vengono inviate tra il server e la pagina in modo diverso modo utilizzando la tecnologia AJAX.
  • Puoi anche chiamare i metodi lato server dal lato client javascript utilizzando un meccanismo che .NET chiama PageMethods. Questo è un altro modo "manuale" di utilizzare AJAX in .NET rispetto al tradizionale UpdatePanel tecnica.
  • Le banche usano la stessa metodologia per mantenere attiva la sessione stai controllando le tue finanze, ma di solito offri un popup poco prima per chiedere se desideri continuare.
  • Mantenere l'accesso forzato dell'utente per un periodo più lungo di una durata normale può essere un rischio per la sicurezza (vedi qualcuno che accede a una libreria o computer scolastico e lasciando la scrivania - dovrebbe continuare quella sessione avanti al giorno successivo

Le seguenti risorse potrebbero aiutarti

risposta data 16.11.2012 - 07:44
fonte

Leggi altre domande sui tag