2009-07-22 12 views
6

Cada vez que se autentique, su aplicación debe cambiar el identificador de sesión que utiliza. Esto ayuda a evitar que alguien configure una sesión, copie el identificador de sesión y engañe al usuario para que use la sesión. Debido a que el atacante ya conoce el identificador de sesión, puede usarlo para acceder a la sesión luego de que el usuario inicie sesión, otorgándole acceso completo. Este ataque se ha llamado "fijación de sesión", entre otras cosas. ¿Cómo puedo cambiar la identificación de la sesión una vez que el usuario inicia sesión en el sistema?Java secure session

+0

¿Hay alguna razón por la que haya preguntado esto dos veces? http://stackoverflow.com/questions/1138436/can-i-regenerate-my-own-session-id-in-servlet – blowdart

+0

sí, no puedo agregar el comentario y responder el mensaje –

Respuesta

0

invalidar la sesión actual y el obtener una nueva sesión:

//invalidate the current session 
request.getSession().invalidate(); 
/* 
get another session and get the ID (getSession()) will create a session if one does not exist 
*/ 
request.getSession().getId(); 
2

Obtener el vigente; invalidarlo; cree uno nuevo ...

1) Obtenga la sesión actual con HttpServletRequest.getSession();
2) Borrar la sesión: HttpSession.invalidate();
3) Crear uno nuevo: HttpServletRequest.getSession(true);

+0

Si utilizo este método, una vez que el usuario inicie sesión, primero cerrará la sesión para regenerar el id. –

+1

, ya que blowdart declaró: "Bueno, eso es una limitación del marco de trabajo que está utilizando, me temo". ¿Puede dar un código de ejemplo de su proceso de autenticación? Esto podría ayudar. – Henrik

1

Hablando en general (porque esto no es un problema de Java en absoluto, es un problema general de la web) la fijación de la sesión se produce cuando las identificaciones de sesión son fáciles de descubrir o adivinar. El principal método de ataque es cuando la ID de sesión está en la URL de una página, por ejemplo http://example.com/index?sessionId=123. Un atacante podría configurar la captura de una sesión y luego insertar el enlace en su página, engañando a un usuario para que lo visite y se convierta en parte de su sesión. Luego, cuando el usuario autentica, la sesión se autentica. La mitigación de esto es no usar ID de sesión basadas en URL, sino usar cookies

Algunas aplicaciones web usarán una sesión de cookie pero la establecerán a partir de la URL inicial, por ejemplo visitando http://example.com/index?sessionId=123 vería la identificación de la sesión en la url y luego cree una cookie de sesión desde allí, estableciendo el id en la cookie de sesión en 123. La mitigación para esto es generar identificadores de sesión aleatorios en el servidor sin utilizar ninguna entrada del usuario como semilla en el generador.

También hay exploits basados ​​en navegador donde un navegador mal codificado aceptará la creación de cookies para dominios que no son el dominio de origen, pero no hay mucho que pueda hacer al respecto. Y Cross Site Scripting ataca donde puedes enviar un comando de script al sitio atacado para establecer la cookie de sesión, lo cual se puede mitigar estableciendo la cookie de sesión como HTTP_ONLY (aunque Safari no respeta este indicador)

Para Java recomendación general es

session.invalidate(); 
session=request.getSession(true); 

sin embargo en un momento en JBoss esto no funciona, - por lo que necesita para comprobar que esto funciona como se espera dentro de su marco elegido.

+0

Intento usar este método, pero el usuario cerrará sesión. Session.invalidate() se llama –

+0

Bueno, eso es una limitación del marco de trabajo que está utilizando, me temo. – blowdart

+0

estoy usando jsf y tomcat, ¿así que tengo algún otro método para resolver el problema? –

7

Aún está en el servidor mientras invalida la sesión.

//get stuff out of session you want before invalidating it. 
currentSession = request.getSession(true); 
UserProfile userProfile = (UserProfile) currentSession.getAttribute("userProfile"); 

//now invalidate it 
currentSession.invalidate(); 

//get new session and stuff the data back in 
HttpSession newSession = request.getSession(true); 
newSession.setAttribute("userProfile", userProfile);