2011-01-29 21 views
7

Se considera una buena práctica de seguridad restablecer la cookie de sesión cuando un usuario se autentica.Cómo restablecer JSESSIONID

¿Cómo hacer esto con Java?

Mi intento hasta ahora es un éxito, pero me preguntaba si hay una manera mejor:

public static HttpSession resetSessionId(HttpSession session, 
     HttpServletRequest request) { 
    session.invalidate(); 
    session = request.getSession(true); 
    return session; 
} 
+0

Creo que es la mejor manera ... –

Respuesta

2

Tu respuesta parece óptima. Otra forma sería la de manipular directamente cookes de esta manera:

Cookie cookie = new Cookie ("JSESSIONID", "randomValue"); 
cookie.setMaxAge(0); 

por lo que crear una nueva cookie con el mismo nombre e inmediatamente expiran, pero yo no lo recomiendo pasando de esta manera desde el suyo es mucho más limpio y bastante obvio para cualquiera que esté familiarizado con las API de Servlet básicas.

+0

De hecho utilizaré esto, porque así podré establecer el indicador "seguro" en falso. Tomcat lo está configurando como 'verdadero', porque me estoy autenticando a través de SSL – Bozho

+0

, de hecho, no funcionó; de alguna manera envió dos JSESSIONID idénticos, en lugar de anular el existente. Así que tuve que dejar todo el restablecimiento por el momento. Pero aún conservando la respuesta aceptada, como la más completa. – Bozho

3

sólo pasar la solicitud a partir del cual tengo la sesión. Si una sesión aún no existe, no tiene sentido crear una solo para invalidarla. Esto también se cumple si la sesión acaba de ser creada por el contenedor (debido a la primera solicitud http del usuario directamente en el formulario de inicio de sesión).

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

bueno, antes de la autenticación debe existir una sesión de sesión (uso una autenticación personalizada, no hay autorizaciones http integradas). Cuando el usuario abre la página de inicio de sesión, se crea una sesión. – Bozho

+0

Prefiero ser muy óptimo con respecto a la creación de sesiones en mis aplicaciones web. El código Java crea explícitamente una sesión http solo cuando es necesario. Mostrar un formulario de inicio de sesión generalmente no requiere ningún control de estado. – cherouvim

+0

@Bozho, lo que dice cherouvim es muy cierto, manejar sesión antes de la autenticación (o cualquier otro estado requerido) puede explotarse fácilmente para OOM DoS (solo llame a la página que crea la sesión pero nunca la almacena, es decir, ejecuta exactamente la misma solicitud GET) . Así que supongo que esta es la mejor respuesta (junto con w/el comentario) – bestsss

2

Tomcat (desde 6.0.24 AFAIK) puede cambiar el sessionId en la autenticación automáticamente, siempre que use mecanismos de autenticación de servlet estándar (autenticación básica basada en formularios). Esto se puede configurar a través de changeSessionIdOnAuthentication para la válvula autenticador básica: http://tomcat.apache.org/tomcat-6.0-doc/config/valve.html

+0

gracias, pero estoy usando una autenticación personalizada. – Bozho

1

Otra forma (no la mejor manera) es llamar 'changeSessionId (existingSession)' de org.apache.catalina.session.StandardManager que va a cambiar el ID de sesión de la sesión actual a una nueva forma aleatoria ID de sesión generada

Debe utilizar StandardManager Mbean para invocar ese método. Por favor, vea Tomcat MBeans

Pseudo código:

objectname contextObjectName = new objectname ("Catalina: type = Manager, path =/lo que sea, host = whateverhost");

mbeanServer.invoke (contextObjectName, "changeSessionId", nuevo Object [] {session}, new String [] {"javax.servlet.http.HttpSession"});