Existe-t-il un moyen d'empêcher le rendu d'une page une fois qu'une personne s'est déconnectée mais a appuyé sur le bouton «Précédent»?

StackOverflow https://stackoverflow.com/questions/64059

Question

J'ai un site Web qui nécessite une connexion et affiche des informations sensibles.

La personne accède à la page, est invitée à se connecter, puis à voir les informations.

La personne se déconnecte du site et est redirigée vers la page de connexion.

La personne peut alors frapper "en arrière". et retournez directement à la page où les informations sensibles sont contenues. Puisque le navigateur le considère simplement comme un rendu HTML, il ne le leur montre pas de problème.

Existe-t-il un moyen d'empêcher l'affichage de ces informations lorsque la personne clique sur le bouton "Retour"? bouton de l'écran déconnecté? Je n'essaie pas de désactiver le bouton de retour lui-même, j'essaie simplement d'empêcher que les informations sensibles ne s'affichent à nouveau parce que la personne n'est plus connectée au site.

Par souci d’argumentation, le site / scénario ci-dessus est en ASP.NET avec authentification par formulaire (ainsi, lorsque l’utilisateur accède à la première page, qui correspond à la page qu’il souhaite, il est redirigé vers la page de connexion - dans cas qui fait la différence).

Était-ce utile?

La solution

La réponse courte est que cela ne peut pas être fait de manière sécurisée.

Cependant, de nombreuses astuces peuvent être mises en œuvre pour rendre difficile la tâche des utilisateurs qui souhaitent réagir et obtenir l'affichage de données confidentielles.

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

Ceci désactivera la mise en cache côté client, mais n'est pas pris en charge par tous les navigateurs .

Si vous avez la possibilité d'utiliser AJAX, les données sensibles peuvent être récupérées à l'aide d'un updatepanel mis à jour à partir du code client. Par conséquent, il ne sera pas affiché lors de la recherche, sauf si le client est toujours connecté.

Autres conseils

La mémoire cache et l'historique sont indépendants et ne doivent pas exister. n'affectent pas l'autre.

La seule exception made pour les banques est la combinaison de HTTPS et de Cache-Control: doit revalider oblige l'actualisation lors de la navigation dans l'historique.

En HTTP simple, il n’ya aucun moyen de le faire, sauf en exploitant les bogues du navigateur.

Vous pouvez le contourner à l’aide de Javascript qui vérifie document.cookie et redirige les messages quand un "tueur" " Le cookie est activé, mais j'imagine que cela pourrait mal tourner si le navigateur ne configure pas / ne supprime pas les cookies exactement comme prévu.

De aspdev.org :

Ajoutez la ligne suivante au-dessus du gestionnaire d'événements Page_Load et votre page ASP.NET ne sera pas mise en cache dans les navigateurs des utilisateurs:

Response.Cache.SetCacheability(HttpCacheability.NoCache)

Paramètres, cette propriété garantit que si l'utilisateur appuie sur le bouton Précédent, le contenu disparaîtra et s'il appuie sur "Actualiser". il sera redirigé vers la page de connexion.

DannySmurf, < meta > les éléments sont extrêmement peu fiables lorsqu'il s'agit de contrôler la mise en cache, et Pragma en particulier encore plus. Référence .

dannyp et d’autres, no-cache n’empêche pas les caches de stocker des ressources sensibles. Cela signifie simplement qu'un cache ne peut pas desservir une ressource qu'il a stockée sans la revalider au préalable. Si vous souhaitez empêcher la mise en cache de ressources sensibles, vous devez utiliser la directive no-store.

Vous pourriez avoir une fonction javascript qui effectue une vérification rapide du serveur (ajax) et si l'utilisateur n'est pas connecté, efface la page en cours et la remplace par un message. Cela serait évidemment vulnérable à un utilisateur dont le javascript est désactivé, mais c'est assez rare. En revanche, il s’agit d’une technologie agnostique pour les navigateurs et les serveurs (asp / php, etc.).

Vous recherchez une directive no-cache:

<META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">

Si vous avez un modèle de page en cours, vous aurez peut-être du mal à jongler, mais je pense que vous pouvez mettre cette directive sur une seule page, sans affecter le reste de votre site (à supposer que ce soit ce que vous voulez. ).

Si vous avez défini cette directive, le navigateur retournera consciencieusement vers le serveur à la recherche d'une nouvelle copie de la page. Votre serveur constatera que l'utilisateur n'est pas authentifié et le renverra à la connexion. page.

L'opération de déconnexion doit être un POST . Le navigateur vous invite ensuite à indiquer "Êtes-vous sûr de vouloir republier le formulaire?" plutôt que d'afficher la page.

Je ne sais pas comment le faire dans ASP.NET, mais en PHP, je ferais quelque chose comme:

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

Ce qui oblige le navigateur à revérifier l'élément, de sorte que la vérification de votre authentification doit être déclenchée et refuser l'accès de l'utilisateur.

C’est un peu pénible, mais si vous aviez une applet Java ou une application flash incorporée et que l’authentification était faite, vous pourriez faire en sorte qu’ils s’authentifient en erm, en temps réel, avec le serveur à chaque fois qu'ils voulaient voir l'information.

En utilisant ceci, vous pouvez également chiffrer toutes les informations.

Il est toujours possible que quelqu'un puisse simplement enregistrer la page avec les informations sensibles, l'absence de cache ne contourne pas cette situation (mais une capture d'écran peut toujours être prise avec une application flash ou java).

Pour être complet:

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

La réponse correcte implique l'utilisation de la définition de l'en-tête HTTP Cache-Control sur la réponse. Si vous voulez vous assurer qu'ils jamais mettent en cache la sortie, vous pouvez effectuer Cache-Control: no-cache. Ceci est souvent utilisé en coordination avec le no-store.

D'autres options, si vous souhaitez une mise en cache limitée, incluent la définition d'une heure d'expiration et d'une révocation obligatoire, mais elles pourraient potentiellement toutes provoquer le réaffichage d'une page mise en cache.

Voir http://www.w3.org/ Protocoles / rfc2616 / rfc2616-sec14.html # sec14.9.4

Eh bien, dans une grande banque brésilienne (Banco do Brasil) connue pour avoir l’un des logiciels de banque à domicile le plus sûr et le plus efficace au monde, ils ont simplement mis history.go (1) dans chaque page. si vous appuyez sur le bouton de retour, vous serez rendu. Simple.

Veuillez regarder dans les en-têtes de réponse HTTP. La plupart du code ASP que les gens publient semble les définir. Soyez sûr.

Le livre Chipmunk de O'Reilly est la bible de HTTP et Le livre HTTP de Chris Shiflett est également valable.

La page Web contenant les informations sensibles peut être renvoyée sous forme de HTTP POST. Dans la plupart des cas, les navigateurs vous donneront alors le message vous demandant si vous souhaitez renvoyer les données. (Malheureusement, je ne trouve pas de source canonique pour ce comportement.)

Je viens d'avoir l'exemple bancaire à l'esprit.

La page de ma banque contient ceci:

<meta http-equiv="expires" content="0" />

Cela devrait être à ce sujet, je suppose.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top