2012-05-09 19 views
11

Non voglio che l'utente torni alle pagine protette facendo clic sul pulsante Indietro dopo aver effettuato il logout. Nel mio codice di disconnessione, sto disattivando le sessioni e reindirizzamento alla pagina di accesso.Ma, penso che il browser stia memorizzando nella cache la pagina in modo che diventi visibile nonostante la sessione venga distrutta dal logout.Previene il pulsante Indietro dopo il logout

sono in grado di evitare questo non permettendo al browser di memorizzare nella cache

header("Cache-Control", "no-cache, no-store, must-revalidate")

Ma in questo modo sto perdere il vantaggio di memorizzazione nella cache del browser.

Si prega di suggerire un modo migliore per raggiungere questo obiettivo. Sento, ci deve essere un modo di gestire questo dal lato client javascript

+5

Non è necessario disabilitare nulla. Se tornano, vengono pubblicate la versione cache della pagina riservata. Se provano a fare clic intorno, nulla funzionerà perché non verrà impostata la sessione appropriata. –

+0

@ N.B. Una possibile soluzione che potrebbe non essere sempre utilizzabile in quanto l'utente potrebbe avere dati sensibili sul suo display e quindi disconnettersi. Un altro arriva (anche se la workstation dovrebbe essere bloccata;)) e preme indietro e vede (anche se memorizzato nella cache) i dati dell'utente precedente. Di solito aggiungiamo un messaggio informativo che avvisa l'utente di chiudere il browser (solo per assicurarsi che tutte le sessioni siano state cancellate). Non è necessariamente il modo migliore, ma almeno hai fornito all'utente le informazioni sul potenziale problema. – Juri

+0

Una correzione economica se tutto il resto fallisce sarebbe un messaggio "Si prega di chiudere questa finestra per motivi di sicurezza" nella pagina disconnessa. – izb

risposta

10

Implementalo in PHP e non in javascript.

Nella parte superiore di ogni pagina, controllare per vedere se l'utente è connesso in caso contrario, essi dovrebbero essere reindirizzati a una pagina di accesso:.

<?php 
     if(!isset($_SESSION['logged_in'])) : 
     header("Location: login.php"); 
?> 

Come lei ha ricordato, alla chiusura della sessione, è sufficiente disinserire il variabile di sessione logged_in, e distruggere la sessione:

<?php 
     unset($_SESSION['logged_in']); 
     session_destroy(); 
?> 

Se l'utente fa clic indietro adesso, non variabile di sessione logged_in sarà disponibile, e la pagina non verrà caricato.

+19

Ho già implementato questa tecnica. Ma il pulsante indietro non richiede effettivamente al server. Invece la retro è resa dalla cache del browser. Quindi non sta reindirizzando alla pagina di accesso. – piyush

+0

Quindi qual è il problema? L'utente non può interagire con il server dopo il logout e con il pulsante indietro recupera solo i dati che ha già visto.Se questi dati possono essere utilizzati in modo improprio da qualcun altro, basta notare che l'utente chiude la finestra o utilizza la scheda anonima, se non lo fa, è colpa sua. – david

0

È possibile inserire una condizione/funzione su ciascuna pagina con restrizioni, controllando se la variabile di sessione appropriata è impostata o meno. In questo modo, è possibile stampare 2 versioni della pagina (una per gli utenti validi e una reindirizzamento alla pagina di accesso)

+1

L'ho già implementato. Ma non impedirà all'utente di eseguire il rendering della pagina quando si fa clic sul pulsante Indietro poiché viene eseguito il rendering dalla cache del browser. Sebbene, se l'utente aggiorna la pagina o esegue un'azione sulla pagina, verrà reindirizzato alla pagina di accesso. Poiché potrebbero esserci poche informazioni personali nelle pagine interne, voglio limitare l'utente a poter visualizzare le pagine precedenti premendo il pulsante indietro dopo il logout. – piyush

0

Evitare all'utente di tornare indietro non è un buon motivo e soprattutto non è affatto sicuro.

Se testate la sessione dell'utente prima di ogni azione "admin" eseguita sul sito Web, dovreste stare bene, anche se l'utente preme il pulsante Indietro, vede la pagina in cache e prova qualcosa.

Il "qualcosa di legami" restituirà un errore poiché la sessione non è più valida.

Invece, dovresti concentrarti sull'avere un back office davvero sicuro.

1

Penso che l'unica opzione lato server sia disabilitare la memorizzazione nella cache. Questo in realtà non è poi così male se si utilizza un'applicazione pesante Javascript poiché l'HTML principale potrebbe essere solo una serie di chiamate JS e le Viste vengono quindi generate al volo. In questo modo la maggior parte dei dati (JS MVC e codice principale) viene memorizzata nella cache, ma la richiesta effettiva della pagina non lo è.

Per aggiungere ai commenti incollati di seguito suggerirei di aggiungere una piccola chiamata AJAX durante il caricamento che si attiva anche per le pagine memorizzate nella cache che vanno al back-end e controlla la sessione. Se la sessione non viene trovata, reindirizza l'utente. Questo è un codice clientide e non una soluzione sicura, certo, ma sembra più bello.

Si potrebbe ottenere questo fuori la vostra coscienza con

Una correzione a buon mercato se tutto il resto fallisce sarebbe un messaggio "Si prega di chiudere questa finestra per motivi di sicurezza" nella pagina di logout.- izb 9 maggio 12 alle 8:36

Ma come N.B. ha detto

Non è necessario disabilitare nulla. Se tornano, vengono pubblicate la versione cache della pagina riservata. Se provano a fare clic intorno, nulla funzionerà perché non verrà impostata la sessione appropriata. - N.B. 9 maggio 12 alle 7:50

0

Ecco una soluzione semplice e veloce.

Al tag modulo di accesso aggiungere target="_blank" che visualizza il contenuto in una finestra diversa. Quindi, dopo il logout, basta chiudere quella finestra e il problema del pulsante Indietro (browser Safari) è risolto.

Anche tentando di utilizzare la cronologia non verrà visualizzata la pagina e invece reindirizzare alla pagina di accesso. Questo va bene per i browser Safari, ma per altri come Firefox il session_destroy(); si prende cura di esso.

0

le pagine su cui è stato effettuato il login, utilizzare setInterval per ogni 1000 ms e verificare che l'utente sia connesso o meno utilizzando ajax. se la sessione utente non è valida, reindirizza la pagina di accesso.

3

stavo affrontando questo stesso problema e ha trascorso tutta la giornata a capire che, infine rettificato come segue:

In script di convalida di accesso se l'utente è autenticato impostare un valore di sessione, per esempio nel modo seguente:

$_SESSION['status']="Active"; 

e poi in User Profile copione messo seguente frammento di codice:

<?php 

session_start(); 

if($_SESSION['status']!="Active") 
{ 
    header("location:login.php"); 
} 

?> 

Quanto sopra codice fa a dire, solo ed onl y se $_SESSION['status'] è impostato su "Active" quindi solo andrà al profilo utente e questa chiave di sessione sarà impostata su "Active" solo se l'utente è autenticato ... [Mind the negation ['! '] Nel frammento di codice di cui sopra]

Probabilmente il logout codice dovrebbe essere la seguente:

{ 
    session_start(); 
    session_destroy(); 
    $_SESSION = array(); 
    header("location:login.php"); 
} 

Spero che questo aiuti ... !!!

0

Si noti che sebbene gli utenti non possano modificare nulla dopo aver reimpostato i dati di sessione e/o cookie, possono comunque vedere le normali informazioni accessibili a un utente che ha effettuato l'accesso come sono apparsi durante l'ultima visita. Ciò è causato dal browser che memorizza nella cache la pagina.

Devi essere sicuro di aggiungere l'intestazione su ogni pagina accessibile da un utente che ha effettuato l'accesso, dicendo al browser che i dati sono sensibili e che non dovrebbero memorizzare nella cache il risultato dello script per il pulsante Indietro. E 'importante aggiungere

header("Cache-Control: no-cache, must-revalidate"); 

Nota che questi altri elementi diversi dal risultato immediato dello script in questa intestazione, sarà ancora memorizzate nella cache e si può trarre beneficio da esso. Vedi che carichi gradualmente parti della tua pagina e tagga dati sensibili e l'HTML principale con questa intestazione.

Come suggerisce la risposta, disinserimento la porzione di logged_in$_SESSION variabile globale può raggiungere la registrazione fuori, ma essere consapevoli che prima, non è necessario distruggere sessione come indicato nel PHP's session_destroy() documentation

Nota: non è necessario chiamare session_destroy() dal solito codice. Pulisci l'array $ _SESSION piuttosto che distruggere i dati della sessione.

E in secondo luogo, è meglio non distruggere la sessione affatto come spiega il prossimo avviso sulla documentazione.

Inoltre, unset() è una funzione pigra; nel senso che non applicherà l'effetto, fino al successivo utilizzo della (parte della) variabile in questione. È buona pratica utilizzare l'assegnazione per l'effetto immediato in casi sensibili, per lo più variabili globali che possono essere utilizzate in richieste concorrenti. Vi suggerisco di usare questo invece:

$_SESSION['logged_in'] = null; 

e lasciare che il garbage collector raccoglie esso, allo stesso tempo, non è valido come utente collegato.

Infine, per completare la soluzione, qui ci sono alcune funzioni:

<?php 
/* 
* Check the authenticity of the user 
*/ 
function check_auth() 
{ 
    if (empty($_SESSION['logged_in'])) 
    { 
     header('Location: login.php'); 
     // Immediately exit and send response to the client and do not go furthur in whatever script it is part of. 
     exit(); 
    } 
} 

/* 
* Logging the user out 
*/ 
function logout() 
{ 
    $_SESSION['logged_in'] = null; 
    // empty($null_variable) is true but isset($null_variable) is also true so using unset too as a safeguard for further codes 
    unset($_SESSION['logged_in']); 
    // Note that the script continues running since it may be a part of an ajax request and the rest handled in the client side. 
} 
0

aggiungere il codice di seguito all'interno del tag script nella pagina di login HTML (o qualsiasi pagina che reindirizzare a dopo il logout)

<script> 
history.pushState(null, null, document.title); 
window.addEventListener('popstate', function() { 
    history.pushState(null, null, document.title); 
}); 
</script> 

Questo script disabiliterà il pulsante Indietro dopo il logout.

Problemi correlati