2013-04-17 17 views
5

Mi viene chiesto degli attacchi di riesame dei cookie con l'autenticazione dei moduli dei siti Web ASP.NET.Autenticazione modulo - Attacco replay cookie - protezione

Ho seguito il consiglio di seguito per proteggere da qualsiasi attacco, ma penso che il sito sia ancora vulnerabile se qualcuno riesce a ottenere il cookie (anche se solo per un breve periodo). C'è un modo per distruggere completamente la sessione di autenticazione basata su form al logout in modo che anche se qualcuno aveva rubato il cookie non ci sarebbe alcuna possibilità di usarlo con cattiveria

Consigli seguita era

Crediamo di aver preso tutte le misure responsabili possiamo proteggerci da questo all'interno dei confini di ASP.NET. Si prega di consultare la risposta dettagliata di seguito.

Tuttavia abbiamo implementato la procedura consigliata da Microsoft per difendersi da questo (vedi http://support.microsoft.com/default.aspx?scid=kb;en-us;900111)

· Il cookie di autenticazione non è mai scritto per un computer client che lo rende difficile da rubare.

· l'applicazione viene eseguita, in grado tramite SSL in modo che un cookie viene mai emesso su una connessione non protetta

· Noi applichiamo la scadenza assoluta con un timeout di 15 minuti che significa che qualsiasi cookie di problemi è inutile dopo tale termine

· Utilizziamo i cookie di httpOnly in modo che nessuno possa intercettarlo o alterarlo in modo grammaticale.

Quindi, anche se erano rotte le precauzioni di cui sopra, che riteniamo altamente improbabile, un utente malintenzionato avrebbe solo 15 finestra minuto per rompere le precauzioni e con successo il login

+0

Usi HSTS e imposti il ​​flag 'secure' sui cookie? – CodesInChaos

risposta

6

Una semplice idea è quella di generare un GUID casuale e memorizzarlo nella sezione dati utente del cookie. Quindi, quando un utente si disconnette, si recupera il guid dai dati utente e lo si scrive in un repository del server con un'annotazione che questa "sessione" è terminata.

Quindi, disporre di un modulo http che verifica ogni richiesta indipendentemente dal fatto che il guid dalla sezione userdata del proprio cookie non indichi una sessione terminata. In caso affermativo, termina la richiesta con un avviso che il cookie scaduto viene riutilizzato.

Viene fornito con un costo di una ricerca aggiuntiva per richiesta.

+3

Un costo aggiuntivo è che questo approccio non si adatta bene, perché in un'app Web molto utilizzata si avrà presto una tabella enorme piena di GUID. Non sarebbe meglio memorizzare il GUID della sessione corrente nella riga utente nel database e impostarlo su NULL quando l'utente si disconnette? In questo modo, avrai un massimo di GUID da memorizzare. – thomaskonrad

+1

@ to0om: questo potrebbe causare problemi quando lo stesso utente ha più sessioni indipendenti attive (ad esempio in browser diversi) e termina alcune di esse senza terminare altre. –

+0

Esatto. Se si desidera supportare più sessioni simultanee, una tabella GUID di sessione separata con una relazione uno-a-molti potrebbe risolvere il problema. Non mi piace l'idea di archiviare GUID scaduti, perché se prendi questo sul serio, devi memorizzarli per sempre per non riattivare le vecchie sessioni in seguito. La memorizzazione di GUID attivi, eventualmente combinati con un limite plausibile di 10 sessioni simultanee, limita il numero massimo di GUID che si dovrebbero memorizzare. – thomaskonrad

3

C'è un modo per distruggere completamente la sessione di autenticazione forme al logout in modo che anche se qualcuno aveva rubato il cookie non ci sarebbe alcuna possibilità di usarlo con cattiveria

il modo è quello di tenere traccia sul server che l'utente è disconnesso e che ora, quindi anche se sta andando per vedere una pagina usando un cookie autenticato valido, ricontrolla se questo utente è anche registrato sui tuoi record del server o meno.

Ciò significa che è necessario disporre di una tabella aggiuntiva sul database per conservare e controllare la disconnessione di accesso dello stato degli utenti e non contare al 100% sul cookie di autenticazione.

C'è un modo per distruggere completamente la sessione di autenticazione basata su form al logout

Nello scenario peggiore che il cookie è stato rubato, in realtà non si può.

Perché è così, perché l'autenticazione del modulo è in realtà mantenere sul cookie tutti i dati (come quando è scaduto, chi è l'utente, ecc.). Quindi non puoi cancellarlo, è sul cookie, e l'alternativa è sincronizzarla con i tuoi dati personalizzati sul server e avere un ulteriore livello di sicurezza.

correlati: Can some hacker steal the cookie from a user and login with that name on a web site?

+0

La sezione dei dati utente del cookie può essere utilizzata per memorizzare informazioni aggiuntive che è possibile utilizzare per correlare i cookie di moduli con informazioni persistenti lato server. In questo modo, in effetti, è POSSIBILE rilevare se un cookie viene riutilizzato o meno al termine della sessione. –

+0

@WiktorZychla Ma se l'hacker ottiene e sostituisce sia il cookie di sessione con il cookie registrato? Quindi è di passaggio il tuo assegno. – Aristos

+0

Esiste un singolo cookie di moduli crittografati con i dati di sessione guid. Questo guid non corrisponde alla sessione lato server ma è solo un token di protezione univoco aggiuntivo. –

0

Ho implementato un sistema che memorizza il SessionID nel cookie auth sulla prima richiesta autenticata e quindi verifica che il SessionID attivo corrisponda al cookie nelle richieste successive. Details on this answer. Ciò ha evitato il monitoraggio lato server suggerito nella risposta di @ WiktorZychla.

Questo potrebbe probabilmente essere migliorato memorizzando un hash di IP in entrata + Request.Browser + SessionID nella sessione e il cookie auth, anziché solo SessionID.

Problemi correlati