8
votes

Comment réinitialiser Jsessionid

Il est considéré comme une bonne pratique de sécurité pour réinitialiser le cookie de session lorsqu'un utilisateur authentifie.

Comment faire cela avec Java?

Ma tentative jusqu'à présent réussie, mais je me demandais s'il y a une meilleure façon: xxx


2 commentaires

Je pense que c'est la meilleure façon ...


J'ai essayé de votre chemin. Mais le jsessidien n'a pas réinitialisé. Savez-vous savoir pourquoi? Je suis en utilisant la résine comme conteneur Web.


4 Réponses :


4
votes

Je ne fais que passer la demande à partir de laquelle je reçois la session. Si une session n'existe pas encore, il ne sert à rien de créer une seule pour l'invalider. Cela détient également si la session vient d'être créée par le conteneur (en raison de la première demande HTTP utilisateur directement sur le formulaire de connexion).

public static ... (HttpServletRequest request) { 
    HttpSession session = request.getSession(false);
    if (session!=null && !session.isNew()) {
        session.invalidate();
    }


3 commentaires

Eh bien, une session devrait exister avant l'authentification (j'utilise une authentification personnalisée, aucun authentification HTTP intégré). Lorsque l'utilisateur ouvre la page de connexion, une session est créée.


Je préfère être très optimal en ce qui concerne la création de session dans mes webApps. Une session HTTP est explicitement créée par le code Java uniquement si nécessaire. L'affichage d'une forme de connexion ne nécessite généralement aucune manipulation de l'état.


@Bozho, ce que dit Cherouvim, c'est très vrai, la session de manutention avant l'authentification (ou tout autre état requis) peut être facilement exploitée pour OOM DOS (appelez simplement la page Création de la session mais ne stockez jamais, c'est-à-dire exactement la même demande d'obtention). Donc, je suppose que c'est la meilleure réponse (aux côtés du commentaire)



2
votes

Votre réponse semble optimale. Une autre façon serait de manipuler directement les cuisiniers à cette mode: xxx

Vous créez donc un nouveau cookie avec le même nom et l'expirer immédiatement, mais je ne recommande pas En aller de cette façon, car le vôtre est beaucoup plus propre et assez évident pour tous ceux qui sont familiers avec les API de servlet de base.


2 commentaires

Je vais réellement utiliser cela, car donc je pourrai définir le drapeau "sécurisé" sur false. Tomcat le régle à vrai , car je vous authentifiait via SSL


En fait, cela n'a pas fonctionné - d'une manière ou d'une autre, elle a envoyé deux jsessionnaires identiques, plutôt que de remplacer l'existant. Je devais donc laisser tomber la réinitialisation complète pour l'instant. Mais préservant toujours la réponse acceptée, comme le plus complet.



2
votes

TOMCAT (depuis 6,0,24 AFAIK) peut modifier automatiquement la sessionId sur l'authentification - tant que vous utilisez des mécanismes d'authentification standard de servlet (authentification basée sur la forme). Ceci peut être configuré via des changements de changements pour la vanne d'authentification de base: http: // tomcat .apache.org / tomcat-6.0-doc / config / valve.html


0 commentaires

1
votes

Une autre solution (pas la meilleure façon) est d'appeler 'changements de changements (existant)' de org.apache.catalina.session.standardmanager qui changera l'ID de session de la session en cours vers une nouvelle ID de session généré au hasard.

Vous devez utiliser StandardManager Mbean pour invoquer cette méthode. S'il vous plaît voir Tomcat Mbeans

pseudo code:

ObjectName contextObjectName = Nouveau nom Nom d'objet ("Catalina: Type = Manager, chemin = / autre, hôte = quoi que ce soit");

MBeanServer.invoke (contextObjectName, "changements de change", nouvel objet [] {session}, nouvelle chaîne [] {"javax.servlet.http.httpsession"});


0 commentaires