¿Cuál es el estado de la técnica para forzar el cierre de sesión en el navegador?

7

Fondo:

La mayoría de los navegadores han implementado alguna forma de funcionalidad de "Restauración de sesión" como una conveniencia para los usuarios donde, si están habilitadas, las cookies de sesión se mantendrán durante los reinicios del navegador.

  • Firefox tiene "Mostrar mis ventanas y pestañas de la última vez"
  • Chrome tiene "Continuar donde lo dejaste"

Los proveedores de navegadores tienen una posición defendible para mantener estas características. Esto pone la responsabilidad en los usuarios de configurar sus navegadores "correctamente" y / o cerrar sesión manualmente en los sitios antes de salir del navegador.

Pregunta:

Para un sitio que proporciona acceso a datos altamente confidenciales Y se usa en entornos informáticos compartidos, ¿cuáles son las mejores prácticas para garantizar que una sesión se destruya cuando se cierra el navegador?

Las posibles ideas incluyen:

  1. Escuchar eventos onbeforeunload o similares y contar el número de ventanas o pestañas abiertas. Cuando el conteo llegue a 0, envíe un mensaje al servidor para invalidar la sesión. Esto parece problemático, debido a: a) las peculiaridades de manejo de eventos en el navegador, yb) la navegación fuera del sitio, intencional o accidental, se trataría de la misma manera que cerrar la última pestaña o ventana.
  2. La implementación de un "latido" en el código del cliente que una vez ausente por un período de tiempo invalida la sesión del servidor. Esto también parece ser un desafío debido a: a) la latencia de la red que posiblemente cause desconexiones positivas falsas, yb) algunos navegadores que suspenden el código JavaScript para pestañas en segundo plano (o aplicaciones en dispositivos móviles).

¿Existen otros enfoques que sean confiables en las distintas plataformas web? ¿Qué hacen actualmente los sitios web de mayor seguridad en este espacio?

    
pregunta bsterne 24.12.2014 - 23:37
fuente

3 respuestas

2

Lo mejor aquí sería usar una combinación de cookies e ID de sesión sucesivas en la URL (donde se coloca un ID de sesión después de la consulta, como thisfile.php? sess = biskgndjkgnsldgsgdj) donde este ID de sesión cambia con cada solicitud.

Esto garantiza que solo una pestaña o ventana del navegador sea válida en un momento específico.

Luego usas el sistema de latido del corazón. El latido del corazón se puede construir fácilmente para enviarlo como 1 latido por 4to segundo, dando 15 latidos por minuto. Y luego cierre la sesión del usuario en el lado del servidor si TODOS los tiempos están ausentes durante un minuto entero.

15 latidos no se van a "retrasar o perder" debido a la latencia de la red. Si llega un solo latido al destino, el temporizador se restablece y permite que falten hasta 15 latidos nuevamente.

Nota: NO PUEDE impedir que la información confidencial esté visible en la última ventana del navegador visible, ya que a menudo se basa en información almacenada en caché en el cliente, incluso si utiliza pragmas sin almacenamiento en caché y sin almacenamiento. Es por eso que debe construir la interfaz de usuario para requerir una acción separada para cada apertura de conjunto de datos de información confidencial. Requerir una acción separada también asegúrese de poder registrar el acceso a cada conjunto de datos.

Ejemplo para una aplicación de datos médicos (cambio para adaptarse a su aplicación): Digamos que usted en la aplicación Médica puede ver la dirección de un paciente, el historial médico de un paciente y las 10 últimas visitas de los pacientes.

En lugar de mostrar todos los datos en la misma página, permitiendo que esta información se almacene en forma no automática, por ejemplo, puede tener un botón para "revelar la dirección de los pacientes", un botón para "revelar el historial de medicamentos" y un botón para "revelar los pacientes 10 últimas visitas ", todas estas hacen una solicitud al servidor.

Por lo tanto, si el usuario de la aplicación nunca presiona "revelar la dirección de los pacientes", los datos médicos anónimos se almacenarán en caché en el cliente.

Si la aplicación tiene algún tipo de registro de transacciones que contiene datos altamente confidenciales, es mejor dividirlo en Días, semanas, meses o lo que sea adecuado en relación con la frecuencia de los eventos, por lo que cada bloque de datos de registro debe abrirse por separado. .

    
respondido por el sebastian nielsen 25.12.2014 - 04:33
fuente
1

Tendrá que hacer un seguimiento del lado del servidor de estado de sesión para esto, y caducar las sesiones que no hayan tenido ninguna actividad en el último X número de segundos. Diga que X es 60 , lo que significa que forzará el cierre de sesión en cualquier sesión que no haya tenido ninguna actividad en el último minuto.

Si no desea que se cierre la sesión de los usuarios si no navegan a otra página dentro de cada minuto, podría tener un AJAX keep-alive que haga una solicitud a la página. Yo sugeriría usar X/2 segundos para esta verificación para permitir el tiempo de latencia de la red. Entonces, cada 30 segundos se activará su AJAX, enviando la cookie de sesión al servidor que actualizará el tiempo last action registrado en la sesión a la hora actual del servidor.

Aún puede implementar un temporizador de inactividad que vencería la sesión si, por ejemplo, recibe 15 minutos de keep-alives AJAX pero no hay solicitudes manuales del usuario.

Al final del día, debe darse cuenta de que esta es una situación controlada por el cliente, por lo que solo puede llevar esto hasta el momento. Por ejemplo, un usuario podría actualizar automáticamente la página utilizando un complemento del navegador para evitar el cierre de sesión automático.

  

algunos navegadores suspenden el código JavaScript para pestañas de fondo (o aplicaciones en dispositivos móviles).

Si esto es una preocupación, podría aumentar el valor de X . Si su aplicación es muy sensible, tal vez la educación del usuario sea la clave. Enseñe a sus usuarios que deben cerrar sesión cuando hayan terminado de usar su aplicación. Podría detectar si los usuarios están agotando el tiempo de espera o explícitamente desconectándose, y si es más frecuente el primero, podría mostrar un mensaje destacado en su sitio.

  

¿Qué hacen actualmente los sitios web de mayor seguridad en este espacio?

Hay una forma muy segura, sin embargo, esto debería implementarse desde el principio dentro de la arquitectura de su aplicación web y no se puede colocar simplemente. Aquí es donde los ID de sesión se colocan en campos de formulario ocultos en lugar de estar contenidos dentro de un Galleta. Sin embargo, deben enviarse por POST (es decir, en el cuerpo de la solicitud). El uso de esto en combinación con el almacenamiento en caché deshabilitado evitará que una sesión continúe entre los reinicios del navegador.

La desventaja de este enfoque es que cada acción de navegación es necesaria para enviar un formulario.

Por ejemplo, podríamos tener un formulario para manejar la navegación en cada página construida así:

<form method="post" action="/navigate">

    <input type="hidden" name="navigationPage" />
    <input type="hidden" name="sessionId" value="12345678" />

</form>

Al hacer clic en la navegación, JavaScript se ejecutará y establecerá navigationPage en el valor apropiado (por ejemplo, myAccount , orderHistory , etc.) y luego enviará el formulario. El /navigate URI verificará el sessionId y luego navegará a la página especificada en navigationPage si la sesión es válida. Usando este método, todas las páginas dentro de su sesión iniciada tendrán el mismo URI ( www.example.com/navigate en este caso).

Esto es más seguro que agregar un valor de cadena de consulta en el sentido de que la ID de la sesión no se filtrará en los encabezados referer en el caso de los enlaces externos. Los enlaces externos pueden simplemente vincularse directamente al recurso y no serán la forma POST que utiliza la navegación interna.

Muchos sistemas bancarios emplean una técnica similar para una protección adicional contra el secuestro de sesiones dentro de la sesión. En estos escenarios, sessionId en el campo de formulario oculto se regenerará en cada carga de página, lo que garantiza que solo un navegador web navegue a la vez. Sin embargo, esto evitará el uso del botón Atrás porque obliga a volver a enviar los datos de la POST, o a abrir enlaces en pestañas separadas del navegador porque la ID no está actualizada en ambos lugares. Esto se usa a menudo en combinación con las cookies de sesión, pero se puede usar de forma aislada. Las acciones que requieren información adicional, como transferencias de dinero, pueden incluir simplemente campos de formulario adicionales que se enviarán con el formulario principal.

Otra ventaja de este enfoque es que es inherentemente seguro contra CSRF . Si otra página realiza una solicitud entre sitios, faltará el sessionId porque no se enviará automáticamente de la misma forma que las cookies.

Esto también se puede implementar en HTML solo sin JavaScript, donde cada botón de la página enviará un ID del navigationPage .

Este enfoque significa que también puedes mantener el tiempo de espera de tu sesión actual y no hay necesidad de un latido del corazón.

    
respondido por el SilverlightFox 29.12.2014 - 18:28
fuente
0

Con la excepción de las versiones anteriores de Internet Explorer, lo que haría sería usar el almacenamiento web para almacenar grandes estados de aplicaciones en el lado del cliente y permitir que JavaScript cargue los datos.

El almacenamiento web ofrece mucho más espacio en torno a 5 MB que las cookies, pero también usaría cookies para almacenar el token de autenticación.

    
respondido por el Archimedes Trajano 26.12.2014 - 18:56
fuente

Lea otras preguntas en las etiquetas