2008-09-28 13 views
10

Estoy usando la versión actual de restful_authentication que se encuentra en github y estoy teniendo un montón de problemas de sesión extraños. El servidor parece estar de alguna manera asignando sesiones a usuarios que no debería ser. Esto solo ocurre cuando se cruza la barrera de sesión/sesión iniciada.Problema de secuestro de sesión inadvertido con autenticación reposada

Aquí hay un ejemplo. Sin sesiones activas en el servidor, inicio sesión en una cuenta con el usuario A. En otra máquina, inicio sesión con el usuario B. Luego, cuando cierre la sesión del usuario B, en algún momento después de que se cierre el redireccionamiento, iniciaré sesión como usuario A. Desde este punto, puedo seguir navegando por el sitio como si hubiera iniciado sesión como ese usuario. Algo que he observado a través de los registros es que cuando ocurre este secuestro, los ID de sesión no son los mismos. El usuario A está conectado en ambas sesiones, pero los ID de la sesión son completamente diferentes. Este es solo un ejemplo de lo que podría pasar. No puedo reproducir el problema de manera confiable ya que aparentemente es aleatorio.

No parece ser un síntoma del entorno o del servidor en el que se está ejecutando. Puedo reproducir el problema usando mestizo y pasajero. También lo he visto en desarrollo y producción. Estoy usando sesiones basadas en db en esta aplicación y se está ejecutando en Rails 2.1.1. Apliqué la opción stateful cuando llamo al generador. De lo contrario, no se han realizado otras modificaciones a la forma en que se manejan las sesiones.

Actualización Este es el método ofensivo que vino directamente de restful_authentication.

# Accesses the current user from the session. 
# Future calls avoid the database because nil is not equal to false. 
def current_user 
    @current_user ||= (login_from_session || login_from_basic_auth || login_from_cookie) unless @current_user == false 
end 

Respuesta

2

No sé si esto es tanto una respuesta, ya que es una solución alternativa. Todo lo que hice fue cambiar a sesiones basadas en cookies y todo está funcionando sin problemas.

3

Esto puede suceder si usted (o los que escribieron restful_authentication) la cache del usuario actual en una variable de clase. He visto varios artículos que defienden el uso de "User.current_user", pero como las clases se almacenan en caché en las solicitudes, esto puede provocar una contaminación de la sesión.

+0

Parece una respuesta plausible, pero aún así pude reproducir este comportamiento de secuestro después de eliminar el almacenamiento del objeto current_user del almacenamiento en una variable de caché. – Jared

+0

Si almacena en caché al usuario actual en una variable de clase, solo tiene que recordar limpiarlo antes de cada solicitud. Algo como: 'before filter: clean_user; before_filter: authenticate' – Arsen7

0

¿Este sitio es remoto? ¿Estás iniciando sesión en dos computadoras separadas en la misma red?

+0

Lo tengo funcionando tanto localmente en desarrollo en mi computadora portátil como en producción en mi servidor. Tiene razón sobre las 2 cuentas en la misma red. Aunque estoy haciendo esto en navegadores separados en máquinas separadas. – Jared

Cuestiones relacionadas