2010-02-22 11 views
31

Ich führe eine Java-Webanwendung.httpservletrequest - neue Sitzung erstellen/Sitzung ändern Id

Mit Blick auf den Login-Code erhält es eine HttpSession aus HttpServletRequest über die Methode getSession() von HttpServletRequest. (Es verwendet einige Werte in der Sitzung für Authentifizierungszwecke)

Allerdings mache ich mir Sorgen über Session-Fixierungsangriffe, also möchte ich nach der ersten Sitzung entweder eine neue Sitzung starten oder die Sitzungs-ID ändern. Ist das möglich?

Antwort

37

Die Servlet 3.0 API ermöglicht es Ihnen nicht, die Sitzungs-ID für eine vorhandene Sitzung zu ändern. Normalerweise sollten Sie zum Schutz vor einer Sitzungsfixierung einfach eine neue erstellen und die alte ebenfalls ungültig machen.

Sie eine Sitzung wie diese

request.getSession(false).invalidate(); 

und erstellen Sie dann eine neue Sitzung mit

getSession(true) (getSession() sollte funktionieren auch)

Selbstverständlich, wenn Sie ein Datum in der Sitzung haben entkräften kann Wenn Sie fortfahren möchten, müssen Sie es von der ersten Sitzung in die zweite Sitzung kopieren.

Hinweis: Für den Sitzungsfixierungsschutz wird es normalerweise als OK angesehen, dies bei der Authentifizierungsanfrage zu tun. Ein höheres Sicherheitsniveau besteht jedoch darin, die alte Sitzung zu wechseln und für jede Anforderung eine neue Sitzung zu erstellen.

+3

Soll das nicht eine NullPointerException geben, wenn getSession noch nicht aufgerufen wurde? – FRotthowe

+0

Stimmt, aber wir gehen davon aus, dass die Sitzung existiert. – pablochan

+3

Ich würde Sie aufrüsten, wenn Sie 'getSession()' anstelle von 'getSession (boolean)' verwendet haben. – BalusC

23

Seit Java EE 7 und Servlet API 3.1 (Tomcat 8) können Sie HttpServletRequest.changeSessionId() verwenden, um ein solches Verhalten zu erreichen. Es gibt auch einen Listener HttpSessionIdListener, der nach jeder Änderung aufgerufen wird.

+0

Shiro und changeSessionId ist eine leistungsstarke Kombination. Es erlaubt mir, meine Lava-Logik ohne Ablenkungen zu schreiben 'if (Erfolg) request.changeSessionId()' keine Notwendigkeit, umzuschreiben, ich bin nere – lrn2prgrm

Verwandte Themen