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.
}
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. 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
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