Comment empêcher un utilisateur de voir les informations des utilisateurs précédents en appuyant sur le bouton "Retour"

Je développe une application web java utilisant servlet, afin d'empêcher l'utilisateur de frapper le bouton arrière pour voir les informations des utilisateurs précédents, j'ai le code suivant:

protected void processRequest(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { HttpSession session=request.getSession(true); response.setContentType("text/html"); response.setHeader("Cache-Control","no-cache,no-store"); response.setDateHeader("Expires",0); response.setHeader("Pragma","no-cache"); ...... // if (!User_Logged_In) session.invalidate(); } 

D'ailleurs, j'ai aussi le code suivant dans le fichier: web / WEB-INF / web.xml

 <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> ...... <filter> <filter-name>ResponseHeaderFilter</filter-name> <filter-class>ResponseHeaderFilter</filter-class> <init-param> <param-name>Cache-Control</param-name> <param-value>private,no-cache,no-store</param-value> </init-param> <init-param> <param-name>Pragma</param-name> <param-value>no-cache</param-value> </init-param> <init-param> <param-name>Expires</param-name> <param-value>0</param-value> </init-param> </filter> </web-app> 

Et le ResponseHeaderFilter.java ressemble à ceci:

 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; public class ResponseHeaderFilter implements Filter { FilterConfig fc; public void doFilter(ServletRequest req,ServletResponse res,FilterChain chain) throws IOException,ServletException { HttpServletResponse response=(HttpServletResponse)res; for (Enumeration e=fc.getInitParameterNames();e.hasMoreElements();) // Set the provided HTTP response parameters { String headerName=(String)e.nextElement(); response.addHeader(headerName,fc.getInitParameter(headerName)); } chain.doFilter(req,response); // Pass the request/response on } public void init(FilterConfig filterConfig) { this.fc=filterConfig; } public void destroy() { this.fc=null; } } 

Jusqu'à présent, il ne fonctionne toujours pas correctement. Le bouton de retour ouvrira une fenêtre d'avertissement indiquant que les données ont expiré, il demande si l'utilisateur veut la repositionner. Si vous choisissez oui, il affichera toujours les informations des pages précédentes. Qu'est-ce que je fais mal? Quel est le problème?

Franc


Oui, je développe une application Web pour un PC en public, si l'utilisateur B frappe le bouton arrière, il pourrait voir les informations privées de l'utilisateur A.

J'essayais d'utiliser l'identifiant de session avec servlet, mais comment le faire, un exemple de code?

J'ai également essayé ce qui suit:

 <Html> <Head>...</Head> <Body onLoad=document.execCommand("ClearAuthenticationCache","false")> ...... <script type="text/javascript"> // Clear current credentials : Requires IE6 SP1 or later // document.execCommand("ClearAuthenticationCache"); document.execCommand("ClearAuthenticationCache","false"); </script> ...... </Html> 

Il fonctionne pour IE mais Firefox.

Comment appuyer sur le bouton Retour pour que l'utilisateur puisse voir les données d' un autre utilisateur? Quel est votre cas d'utilisation? Est-il conçu pour un terminal public, où chaque utilisateur soumet des données et s'en va ensuite? Dans ce cas, associez chaque entrée à un identifiant de session unique. Gardez une trace des identifiants de session valides dans votre serveur. Une fois la saisie soumise, supprimez cet identifiant de session des identifiants valides. Si cela survient, n'indiquez pas l'information.

Votre problème est que vous essayez de garder le client de voir ce qu'il y a sur son propre ordinateur. Vous ne pouvez pas les empêcher de regarder le cache de leur navigateur. Vous ne pouvez pas les empêcher de désactiver JavaScript (et donc votre code de script). Vous ne pouvez pas les empêcher d'utiliser un navigateur qui n'observe pas cette convention "repost" que vous mentionnez.

Ce n'est pas un problème qui peut être résolu avec JavaScript ou une solution côté serveur. Cette partie de la raison pour laquelle "briser le bouton arrière" est mal vu: il ne résout vraiment rien.

Briser le bouton de retour est un péché cardinal de développement web.

Mais vous pouvez essayer un peu de script java dans le chargement qui a actualisé les détails en fonction de la session actuellement connectée.

Cela ressemble à votre vrai problème, c'est que le re-post fonctionne. Ce serait probablement parce que vous:

  1. Font confiance aux informations d'identification du navigateur plutôt que de la session en cours, ou
  2. Ne vérifient pas que la session en cours est autorisée à accéder aux données représentées par une valeur clé / identifiant envoyée depuis le navigateur

Je recommande qu'après l'ouverture d'un utilisateur, vous ne fiez jamais confiance à un nom d'utilisateur soumis par le navigateur. Idéalement, utilisez les services de sécurité d'un framework comme Spring Security, mais en leur absence, vous pouvez compter sur HttpServletRequest.getUserPrincipal () .

Pour vous assurer que la session en cours est autorisée, accédez aux données que vous pourriez utiliser un mécanisme de liste de contrôle d'accès fourni par un cadre tel que Spring Security ou incluez WHERE OWNER=? Dans les requêtes de votre base de données.

Je ne sais pas si je comprends exactement votre problème. Êtes-vous préoccupé par le fait que la personne A se déconnecte, la personne B se connecte à partir du même PC et de l'instance du navigateur, et que vous souhaitez empêcher la personne B de voir ce que A regardait?

Si tel est le cas, il devrait suffire de vérifier les informations d'identification de l'utilisateur sur chaque chargement de page. Vérifiez que l'utilisateur actuel est autorisé à afficher les données demandées.

Je ne suis pas sûr de bien comprendre votre problème, mais il semble que vous permettez les rePOST.

Une approche pour empêcher la nouvelle présentation est d'utiliser des jetons. Mettez un jeton aléatoire dans la forme et la session. Lors de la soumission, vérifiez que le jeton envoyé correspond au jeton de la session

  • Si c'est le cas, remplacez le jeton dans la session par un nouveau et traitez la demande
  • Sinon cessez de traiter la demande).

Tous les différents navigateurs ont des comportements et des handicaps différents en ce qui concerne la façon dont l'histoire se rapporte au cache et aux différents en-têtes disponibles pour le contrôler. Firefox 3 fonctionne différemment de Firefox 2, en affichant de nouveau des données potentiellement sensibles lorsqu'un utilisateur clique sur le bouton arrière malgré l'utilisation de directives de mise en cache pour l'empêcher. La meilleure solution consiste à utiliser un cookie de session qui n'est pas persisté et à informer l'utilisateur de la fermeture de la fenêtre du navigateur après la connexion. Surtout s'ils se trouvent dans un terminal public. Douloureux, je sais, mais les offres actuelles du navigateur et la spécification HTTP ne fournissent aucun mécanisme pour traiter l'historique du navigateur. L'historique peut être traité différemment de la mise en cache par un agent utilisateur selon la spécification HTTP. Voir 13.13 Listes d'historique telles que définies dans RFC 2616 Hypertext Transfer Protocol – HTTP / 1.1 pour le problème et la raison d'être.

Si vous craignez que quelqu'un ait vu ce qui se trouvait dans une page précédente, vous pouvez utiliser un formulaire caché pour le post "réel" et utiliser celui qui est juste pour affichage pour l'utilisateur. Lorsque l'utilisateur soumet le formulaire d'affichage, vous copiez tous les champs dans le formulaire caché, effacez le formulaire d'affichage, puis soumettez le formulaire caché.

Je suis d'accord avec tous les autres personnes – en train de jouer avec le bouton arrière, c'est une mauvaise façon de gérer les informations protégées.

Je ne suis pas sûr à 100% que ce soit une solution à votre problème, car je ne comprends pas complètement comment vous obtiendrez les données d'un autre utilisateur en retour. Cependant, je sais que pour les applications Web que je développe, j'essaie d'utiliser exclusivement Redirect After Post pour éviter le bouton arrière et actualiser les sous-formulaires.

Jeff Atwood a décrit une façon d'éviter les attaques CSRF et XSRF ici .

Vous pourriez utiliser cette technique pour résoudre votre problème « utilisateurs qui voyaient ce qu'ils ne devraient pas voir ».

Je pense que c'est autant un défi d'interface utilisateur qu'un problème de codage. En plus de toutes les techniques anti-mise en cache que vous employez, vous devez préciser à l'utilisateur qu'elles doivent accéder à un bouton évident de "Déconnexion" (ou équivalent) lorsqu'ils sont terminés.

Si cela pourrait aider. Cela fonctionne pour ASP, utilisez une solution équivalente pour d'autres langues.

J'ai eu un problème similaire dans .Net. J'ai ajouté le javascript suivant à ma page de connexion:

Document.execCommand ("ClearAuthenticationCache", "false");

Maintenant, si vous appuyez sur le bouton Précédent, vous devez vous authentifier à nouveau.