web-dev-qa-db-fra.com

Bouton de prévention après la déconnexion

Je ne veux pas que l'utilisateur retourne aux pages sécurisées en cliquant sur le bouton de retour après sa déconnexion. Dans mon code de déconnexion, je désactive les sessions et je redirige vers une page de connexion. Mais je pense que le navigateur met la page en cache afin qu'elle devienne visible même si la session est détruite après la déconnexion.

Je peux éviter cela en empêchant le navigateur de mettre en cache

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

Mais de cette façon, je perds l’avantage de la mise en cache du navigateur.

S'il vous plaît suggérer un meilleur moyen d'y parvenir. Je pense qu'il doit y avoir un moyen de gérer cela par le côté client javascript

11
piyush

Implémentez ceci dans PHP et non pas en javascript.

En haut de chaque page, vérifiez si l'utilisateur est connecté. Sinon, il devrait être redirigé vers une page de connexion:

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

Comme vous l'avez mentionné, lors de la déconnexion, il suffit de désélectionner la variable de session logs_in et de détruire la session:

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

Si l'utilisateur clique en arrière maintenant, aucune variable de session log_in ne sera disponible et la page ne se chargera pas.

10

Je faisais face au même problème et je passais toute la journée à le résoudre, Le rectifiant finalement comme suit:

Dans le script de validation de connexion, si l'utilisateur est authentifié, définissez une valeur de session, par exemple, comme suit:

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

Et ensuite, dans le script de profil d’utilisateur, mettez l’extrait de code suivant:

<?php

session_start();

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

?>

Le code ci-dessus n’est valable que si et seulement si $_SESSION['status'] est défini sur "Active", alors il ira au profil utilisateur et cette clé de session sera définie à "Active" uniquement si l’utilisateur est authentifié ... [Attention, la négation ['! '] dans l'extrait de code ci-dessus]

Le code de déconnexion devrait probablement être comme suit:

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

J'espère que cela t'aides...!!!

3

Voici une solution simple que j'ai utilisée dans mon application.

Ajoutez le code ci-dessous à l'intérieur de la balise de script dans la page HTML de connexion (ou la page vers laquelle elle redirige après la déconnexion)

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

Cela désactivera le bouton retour. Vous ne pourrez pas revenir en arrière en cliquant sur le bouton Retour. 

Remarque: non testé sur Safari.

1
Mashmoom

Je pense que votre seule option côté serveur est d'interdire la mise en cache. En réalité, ce n’est pas si grave si vous utilisez une application lourde Javascript, car votre code HTML principal peut ne consister en une série d’appels JS et les vues sont ensuite générées à la volée. Ainsi, la majeure partie des données (JS MVC et code principal) est mise en cache, mais la demande de page réelle ne l’est pas.

Pour ajouter aux commentaires collés ci-dessous, je suggère d'ajouter un petit appel AJAX pendant le temps de chargement qui se déclenche même pour les pages en cache qui accède à votre back-end et vérifie la session. Si pas session n'est pas trouvé, il redirigerait l'utilisateur. Ceci est du code client et pas une solution sécurisée, bien sûr, mais semble plus agréable.

Vous pourriez obtenir ceci hors de votre conscience avec

Un correctif bon marché si tout le reste échoue serait un message "Fermez cette fenêtre pour des raisons de sécurité" sur la page déconnectée. - izb 9 mai 12 à 8:36

Mais comme N.B. m'a dit 

Vous n'avez rien à désactiver. S'ils reviennent en arrière, ils reçoivent la version en cache de la page restreinte. S'ils essaient de cliquer dessus, rien ne fonctionnera car la session appropriée ne sera pas définie. - N.B. 9 mai 12 à 7h50

1
Nenotlep

les pages sur lesquelles vous devez être connecté, utilisez setInterval toutes les 1000 ms et vérifiez si l'utilisateur est connecté ou non avec ajax. si la session de l'utilisateur n'est pas valide, redirigez-le pour vous connecter à la page.

0
swapnil shahane

Voici une solution simple et rapide. 

Ajoutez à la balise de formulaire de connexion target="_blank" qui affiche le contenu dans une autre fenêtre. Ensuite, après la déconnexion, fermez simplement la fenêtre et le problème du bouton Précédent (navigateur Safari) est résolu. 

Même en essayant d'utiliser l'historique, la page ne sera pas affichée, mais redirigée vers la page de connexion. Cela convient pour les navigateurs Safari, mais pour d'autres, comme Firefox, la fonction session_destroy(); s'en charge. 

0
AntoBarn

Vous pouvez insérer une condition/fonction sur chaque page restreinte, en vérifiant si la variable de session appropriée est définie ou non. De cette façon, vous pouvez imprimer 2 versions de la page (une pour les utilisateurs valides et une autre pour la page de connexion).

0
CosminO

Éviter le retour de l'utilisateur n'est pas une bonne raison et surtout pas du tout sécurisée.

Si vous testez la session de l'utilisateur avant chaque action "admin" effectuée sur le site Web, tout va bien, même si l'utilisateur clique sur le bouton Précédent pour voir la page en cache et essayer quelque chose.

Le lien "quelque chose" retournera une erreur puisque la session n'est plus valide.

Au lieu de cela, vous devriez vous concentrer sur un back office réellement sécurisé.

0
Cyril N.

Notez que bien que les utilisateurs ne puissent rien modifier après la réinitialisation des données de session et/ou des cookies, ils peuvent toujours voir les informations habituelles accessibles à un utilisateur connecté telles qu'elles apparaissaient lors de la dernière visite. Cela est causé par la mise en cache de la page par le navigateur.

Assurez-vous d’ajouter l’en-tête sur chaque page accessible à un utilisateur connecté, en indiquant au navigateur que les données sont sensibles et qu’ils ne doivent pas mettre en cache le résultat du script pour le bouton Précédent. Il est important d'ajouter

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

Notez que ces autres éléments que le résultat immédiat du script sous cet en-tête seront toujours mis en cache et que vous pourrez en tirer parti. Veillez à charger progressivement certaines parties de votre page et à baliser les données sensibles et le code HTML principal avec cet en-tête.

Comme le suggère la réponse, la déconnexion de la partie logged_in de la variable globale $_SESSION peut permettre la déconnexion, mais sachez tout d’abord qu’il n’est pas nécessaire de détruire la session comme indiqué dans la documentation session_destroy() de PHP

Remarque: Il n'est pas nécessaire d'appeler session_destroy () à partir du code habituel. Nettoyez le tableau $ _SESSION plutôt que de détruire les données de session.

Et deuxièmement, il vaut mieux ne pas détruire la session du tout, comme l'explique le prochain avertissement sur la documentation.

De plus, unset() est une fonction paresseuse; ce qui signifie qu'il n'appliquera pas l'effet jusqu'à la prochaine utilisation de la (partie de) la variable en question. Il est recommandé d’utiliser l’affectation à effet immédiat dans les cas sensibles, principalement des variables globales pouvant être utilisées dans des demandes simultanées. Je vous suggère d'utiliser ceci à la place:

$_SESSION['logged_in'] = null;

et laissez le ramasse-miettes le collecter, en même temps, il n'est pas valide en tant qu'utilisateur connecté.

Enfin, pour compléter la solution, voici quelques fonctions:

<?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
Cunning