C’è un modo per mantenere una pagina dal rendering una volta che una persona ha effettuato il logout ma ha premuto il pulsante “indietro”?

Ho un sito Web che richiede un accesso e mostra informazioni sensibili.

La persona va alla pagina, viene richiesto di accedere, quindi ottiene vedere le informazioni.

La persona si disconnette dal sito e viene reindirizzato alla pagina di accesso.

La persona può quindi premere “indietro” e tornare alla pagina in cui sono contenute le informazioni sensibili. Dal momento che il browser la pensa semplicemente come renderizzata in HTML, non mostra loro alcun problema.

C’è un modo per impedire che tali informazioni vengano visualizzate quando la persona preme il pulsante “indietro” dalla schermata disconnessa? Non sto tentando di distriggersre il pulsante Indietro, sto solo cercando di mantenere le informazioni sensibili da essere visualizzate di nuovo perché la persona non è più loggato nel sito.

A titolo di argomento, il sito / scenario sopra riportato è in ASP.NET con Autenticazione moduli (quindi quando l’utente accede alla prima pagina, che è la pagina che desidera, viene reindirizzato alla pagina di accesso, nel caso in cui ciò avvenga una differenza).

La risposta breve è che non può essere fatto in modo sicuro.

Vi sono, tuttavia, molti trucchi che possono essere implementati per rendere difficile agli utenti di tornare indietro e visualizzare i dati sensibili.

Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.Cache.SetExpires(Now.AddSeconds(-1)); Response.Cache.SetNoStore(); Response.AppendHeader("Pragma", "no-cache"); 

Ciò disabiliterà la memorizzazione nella cache sul lato client, tuttavia questo non è supportato da tutti i browser .

Se si ha la possibilità di utilizzare AJAX, i dati sensibili possono essere recuperati utilizzando un updatepanel che viene aggiornato dal codice client e pertanto non verrà visualizzato quando si esegue il richiamo a meno che il client non abbia ancora effettuato l’accesso.

Cache e storia sono indipendenti e non si dovrebbero influenzare a vicenda.

L’unica eccezione fatta per le banche è quella combinazione di HTTPS e Cache-Control: must-revalidate forze Cache-Control: must-revalidate aggiornamento durante la navigazione nella cronologia.

Nel semplice HTTP non c’è modo di farlo se non sfruttando i bug del browser.

Potresti modificarlo usando Javascript che controlla document.cookie e reindirizza quando viene impostato un cookie “killer”, ma immagino che questo potrebbe andare seriamente male quando il browser non imposta / cancella i cookie esattamente come previsto.

Da aspdev.org :

Aggiungi la seguente riga in cima al gestore di eventi Page_Load e la pagina ASP.NET non verrà memorizzata nella cache nei browser degli utenti:

 Response.Cache.SetCacheability(HttpCacheability.NoCache) 

Le impostazioni di questa proprietà assicurano che se l’utente preme il pulsante back, il contenuto verrà eliminato e se preme “refresh” verrà reindirizzato alla pagina di accesso.

DannySmurf, gli elementi sono estremamente inaffidabili quando si tratta di controllare il caching, e in particolare di Pragma ancora di più. Riferimento

dannyp e altri, no-cache non impedisce alle cache di archiviare risorse sensibili. Significa semplicemente che una cache non può servire una risorsa che ha memorizzato senza prima riconvalidarla. Se si desidera impedire la memorizzazione delle risorse riservate, è necessario utilizzare la direttiva no-store.

Si può avere una funzione javascript per un rapido controllo del server (ajax) e se l’utente non ha effettuato l’accesso, cancella la pagina corrente e la sostituisce con un messaggio. Questo sarebbe ovviamente vulnerabile a un utente che non ha javascript, ma è piuttosto raro. Al rialzo, questo è agnostico sia per browser che per tecnologia server (asp / php ecc.).

Stai cercando una direttiva no-cache:

  

Se hai un design di una pagina master, questo può essere un po ‘un gioco da ragazzi, ma credo che tu possa mettere questa direttiva su una singola pagina, senza intaccare il resto del tuo sito (presumendo che sia quello che vuoi).

Se hai impostato questa direttiva, il browser tornerà doverosamente al server alla ricerca di una copia completamente nuova della pagina, che farà sì che il tuo server veda che l’utente non è autenticato e lo colpisce nella pagina di accesso.

Fare in modo che l’operazione di logout sia POST . Quindi il browser chiederà “Sei sicuro di voler ri-postare il modulo?” piuttosto che mostrare la pagina.

Non so come farlo in ASP.NET ma in PHP vorrei fare qualcosa come:

 header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Cache-Control: no-cache"); header("Pragma: no-cache"); 

Il che costringe il browser a ricontrollare l’elemento, quindi deve essere triggersto il controllo dell’autenticazione, negando l’accesso dell’utente.

È un po ‘impegnativo, ma se avessi un’applet java o un’applicazione flash che è stata incorporata e l’autenticazione è stata eseguita tramite questo potresti fare in modo che dovessero autenticarsi, erm, “in tempo reale” con il server ogni volta volevano vedere le informazioni.

Usando questo si potrebbe anche criptare qualsiasi informazione.

C’è sempre la possibilità che qualcuno possa semplicemente salvare la pagina con le informazioni sensibili attive, non avendo la cache non è ansible aggirare questa situazione (ma in ogni caso uno screenshot può sempre essere preso da un’applicazione flash o java).

Per completezza:

 Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.Cache.SetNoStore(); Response.Cache.SetExpires(DateTime.Now.AddMinutes(-1)); 

La risposta corretta prevede l’uso dell’impostazione dell’intestazione HTTP Cache-Control sulla risposta. Se vuoi assicurarti che non memorizzino mai l’output in cache, puoi fare Cache-Control: no-cache. Questo è spesso usato in coordinamento con il no-store.

Altre opzioni, se si desidera il caching limitato, includono l’impostazione di un tempo di scadenza e la necessità di eseguire nuovamente la convalida, ma queste potrebbero potenzialmente causare la visualizzazione di una pagina memorizzata nella cache.

Vedi http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4

Bene, in una grande società bancaria brasiliana (Banco do Brasil) che è nota per avere uno dei software di home banking più sicuri ed efficienti del mondo, si limita a inserire history.go (1) in ogni pagina. Quindi, se colpisci il pulsante indietro, verrai restituito. Semplice.

Si prega di esaminare le intestazioni delle risposte HTTP. La maggior parte del codice ASP che le persone pubblicano sembra volerle impostare. Essere sicuro

Il libro dei chipmunk di O’Reilly è la bibbia di HTTP, e anche il libro di Chris Shiflett su HTTP è buono.

Puoi fare in modo che la pagina web con il sensibile venga restituita come un POST HTTP, quindi nella maggior parte dei casi i browser ti invieranno il messaggio che ti chiede se vuoi inviare nuovamente i dati. (Purtroppo non riesco a trovare una fonte canonica per questo comportamento.)

Ho appena avuto l’esempio bancario in mente.

La pagina della mia banca contiene questo:

  

Questo dovrebbe essere su questo suppongo.