2011-02-11 12 views
5

che sto incontrando un problema (apparentemente comune) con cache del browser, e le mie pagine protette essendo accessibile tramite il pulsante Indietro (dopo il logout dell'utente.)Arrestare il pulsante Indietro per esporre pagine sicure?

Ecco il mio logout.php

<?php 
    // 1. Find the session 
    session_start(); 

    // 2. Unset all the session variables 
    $_SESSION = array(); 

    // 3. Destroy the session cookie 
    if(isset($_COOKIE[session_name()])) { 
     setcookie(session_name(), '', time()-42000, '/'); 
    } 

    // 4. Destroy the session 
    session_destroy(); 

    redirect_to('index.php?logout=1'); 
?> 

Questo riesce a disconnettere gli utenti su IE7, IE8, Chrome e Firefox - ma in Safari, posso premere il pulsante Indietro (subito dopo aver effettuato il logout) e vedere ancora il contenuto sicuro. Se rinfresco la pagina sicura, mi si avvia alla schermata di accesso (come dovrebbe.)

si può provare da soli @http://labs.inversepenguin.com (utente: impilare & passaggio:. Overflow)

Ho provato con :

<META HTTP-EQUIV="Pragma" CONTENT="no-cache"> 
<META HTTP-EQUIV="Expires" CONTENT="-1"> 

... ma non ha alcun effetto. Qualcuno può offrire qualche consiglio? Ho trovato this article il caching del browser, ma devo ancora trovare una risposta all'interno di esso ... anche se ho trovato: "problema"

<?php 
Header("Cache-Control: must-revalidate"); 

$offset = 60 * 60 * 24 * 3; 
$ExpStr = "Expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT"; 
Header($ExpStr); 
?> 

... che pure non risolve il Hmm.

+0

I browser sono liberi di memorizzare i dati nella cache e visualizzarli successivamente quando l'utente preme il pulsante "indietro". Questo è probabilmente quello che sta succedendo qui, e non c'è molto che tu possa fare al riguardo. – You

+0

Correlati: http: // stackoverflow.it/questions/64059/is-there-a-way-to-keep-a-page-from-rendering-once-a-person-has-logged-out-but-hit –

+1

Una volta che il contenuto è stato consegnato, non è più sicuro. –

risposta

3

Se è possibile utilizzare HTTPS, questo combinato con un'intestazione Cache-control: no-cache disabiliterà la "cache di pagina" (il termine WebKit per la cache in memoria/back-forward). Lo svantaggio di questo è che sarà disabilitato per tutte le visualizzazioni di pagina sicure, non solo dopo la disconnessione. (Source; nota che stanno lavorando per consentire le eccezioni, vale la pena tenerlo d'occhio.)

Se è possibile dipendere da JavaScript, il collegamento di un gestore di eventi unload impedirà la "cache di pagina". Ciò ha il vantaggio di consentire anche di interrompere la cache solo quando si fa clic su un pulsante o un collegamento di "disconnessione", collegando solo il gestore di eventi unload. (Source)

Nessuna di queste soluzioni è ideale, ma una di queste potrebbe essere un compromesso utile.

1

Questo sembra essere un problema di webkit/Safari. Questo è stato chiesto prima senza una risposta definitiva qui - Safari Back button not honouring PHP logout session

Dai uno sguardo ai link nella risposta, penso che troverai la tua risposta nell'evento Unload.

+0

Non sono d'accordo con l'idea che si tratti di un "problema". Quando premo il pulsante Indietro, mi aspetto di vedere la stessa cosa che ho visto visitando originariamente la pagina. Arriverei persino a dire che tutti gli altri browser stanno sbagliando. – You

+0

È sicuramente un problema perché sconfigge completamente lo scopo di disconnessione per cominciare. Se facendo clic sul pulsante di disconnessione non si impedisce l'accesso alla parte protetta del sito, allora che cosa fa? –

+0

@Brent: non esiste alcun concetto di "voce" o "uscita" in HTTP. È tutto solo richiedendo risorse dagli URL. Nessuno stato è mantenuto. Cliccando su "disconnetti" dovresti davvero disconnetterti. Puoi ancora fare clic sul pulsante Indietro per rivedere la pagina appena disconnessa, SE il browser l'ha memorizzato nella cache (che non dovrebbe avere se rispetta le intestazioni della cache di risposta HTTP). Tuttavia, ciò non significa che sei ancora loggato, o che qualsiasi link nella pagina funzionerà ancora. Questo è il motivo per cui i siti sensibili (come le banche) ti implorano sempre di chiudere il browser dopo aver effettuato il logout. – alexantd

0

Parte del problema è che si sta impostando un'intestazione Expires in futuro. I browser utilizzano l'intestazione Expires come indicatore di quanto tempo deve rimanere nella cache. Prova questo:

$ offset = 60 * 60 * 24 * 3;
$ ExpStr = "Scade:". gmdate ("D, d M Y H: i: s", time() - $ offset). " GMT";
Intestazione ($ ExpStr);

Questo imposterà un'intestazione di scadenza nel passato e impone al browser di richiedere nuovamente la pagina ogni volta.

+0

Ho provato l'intestazione '(" Expires: Mon, 23 Jul 1997 05:00:00 GMT ");' ma inutilmente; Safari consente ancora l'accesso alla pagina. – jlmakes

Problemi correlati