¿Hay alguna forma de evitar que una página se muestre una vez que una persona ha cerrado sesión pero ha pulsado el botón "atrás"?


Tengo un sitio web que requiere un inicio de sesión y muestra información confidencial.

La persona va a la página, se le pide que inicie sesión y luego ve la información.

La persona cierra sesión en el sitio y es redirigida a la página de inicio de sesión.

La persona entonces puede golpear "atrás" y volver a la página donde está contenida la información sensible. Dado que el navegador solo piensa en él como HTML renderizado, se lo muestra a ellos no hay problema.

Hay una manera para evitar que esa información se muestre cuando la persona pulsa el botón" atrás " de la pantalla de cierre de sesión? No estoy tratando de desactivar el botón atrás en sí, solo estoy tratando de evitar que la información confidencial se muestre de nuevo porque la persona ya no está registrada en el sitio.

Por el bien del argumento, el sitio/escenario anterior está en ASP.NET con la autenticación de formularios (por lo que cuando el usuario va a la primera página, que es la página que desea, se redirige a la página de inicio de sesión - en caso de que haga una diferencia).

Author: Ryan Shripat, 2008-09-15

16 answers

La respuesta corta es que no se puede hacer de forma segura.

Hay, sin embargo, una gran cantidad de trucos que se pueden implementar para que sea difícil para los usuarios devolver el golpe y obtener datos confidenciales mostrados.

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(Now.AddSeconds(-1));
Response.Cache.SetNoStore();
Response.AppendHeader("Pragma", "no-cache");

Esto deshabilitará el almacenamiento en caché en el lado del cliente, sin embargo, esto es no es compatible con todos los navegadores.

Si tiene la opción de usar AJAX, los datos confidenciales se pueden recuperar utilizando un updatepanel que se actualiza desde el código del cliente y, por lo tanto, no se se muestra al devolver el golpe a menos que el cliente siga conectado.

 13
Author: Claus Thomsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-01 21:46:27

La caché y el historial son independientes y uno no debe afectarse entre sí.

La única excepción hecha para banks es que la combinación de HTTPS y Cache-Control: must-revalidate fuerza la actualización al navegar en el historial.

En HTTP simple no hay manera de hacer esto excepto explotando errores del navegador.

Puedes hackearlo usando Javascript que comprueba document.cookie y redirige cuando se establece una cookie" asesina", pero me imagino que esto podría salir seriamente mal cuando el navegador no lo hace establezca / borre las cookies exactamente como se espera.

 9
Author: Kornel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-19 22:57:25

De aspdev.org:

Agregue la siguiente línea en la parte superior del controlador de eventos Page_Load y su ASP.NET la página no se almacenará en caché en los navegadores de los usuarios:

Response.Cache.SetCacheability(HttpCacheability.NoCache)

Settings esta propiedad asegura que si el usuario pulsa el botón atrás el contenido desaparecerá, y si presiona "refresh" será redirigido a la página de inicio de sesión.

 3
Author: Espo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-15 18:03:31

DannySmurf, los elementos son extremadamente poco confiables cuando se trata de controlar el almacenamiento en caché, y Pragma en particular aún más. Referencia.

 1
Author: Jim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-15 16:10:46

Dannyp y otros, no-cache no impide que las cachés almacenen recursos confidenciales. Simplemente significa que una caché no puede servir un recurso que ha almacenado sin revalidar primero. Si desea evitar que los recursos confidenciales se almacenen en caché, debe usar la directiva no-store.

 1
Author: Jim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-15 16:14:19

Puede tener una función javascript que realiza una comprobación rápida del servidor (ajax) y si el usuario no ha iniciado sesión, borra la página actual y la reemplaza con un mensaje. Esto obviamente sería vulnerable a un usuario cuyo javascript está desactivado, pero eso es bastante raro. Por el lado positivo, esto es tanto la tecnología del navegador como la del servidor (asp/php, etc.) agnóstica.

 1
Author: Jason Coyne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-20 15:53:22

Está buscando una directiva sin caché:

<META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">

Si tienes un diseño de página maestra en marcha, esto puede ser un poco un malabarismo, pero creo que puedes poner esta directiva en una sola página, sin afectar al resto de tu sitio (asumiendo que eso es lo que quieres).

Si tiene esta directiva establecida, el navegador se dirigirá diligentemente al servidor en busca de una copia nueva de la página, lo que hará que su servidor vea que el usuario no está autenticado y se bloquee él a la página de inicio de sesión.

 0
Author: TheSmurf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-15 15:44:29

Que la operación de cierre de sesión sea POST. A continuación, el navegador le pedirá "¿ Está seguro de que desea volver a publicar el formulario?"en lugar de mostrar la página.

 0
Author: Jason Cohen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-15 15:44:57

No se como hacerlo en ASP.NET pero en PHP haría algo como:

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-cache");
header("Pragma: no-cache");

Que obliga al navegador a volver a comprobar que el elemento, por lo que su comprobación de autenticación debe activarse, negando el acceso del usuario.

 0
Author: UnkwnTech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-15 15:45:26

Es un poco difícil, pero si tuviera un applet de Java o una aplicación flash que estuviera incrustada y la autenticación se hiciera a través de eso, podría hacerlo de modo que tuvieran que autenticarse en, erm, 'en tiempo real' con el servidor cada vez que quisieran ver la información.

Usando esto también podría cifrar cualquier información.

Siempre existe la posibilidad de que alguien pueda guardar la página con la información confidencial, no tener caché no va a evitar esto situación (pero entonces siempre se puede tomar una captura de pantalla de una aplicación flash o java).

 0
Author: Henry B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-15 15:55:56

Para completar:

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();
Response.Cache.SetExpires(DateTime.Now.AddMinutes(-1));
 0
Author: martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-15 15:59:16

La respuesta correcta implica el uso de establecer el encabezado HTTP Cache-Control en la respuesta. Si desea asegurarse de que nunca cache la salida, puede hacer Cache-Control: no-cache. Esto se usa a menudo en coordinación con no-store también.

Otras opciones, si desea un almacenamiento en caché limitado, incluyen establecer un tiempo de caducidad y debe revalidar, pero todas ellas podrían causar que una página en caché se muestre de nuevo.

Véase http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4

 0
Author: Daniel Papasian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-15 16:31:21

Bueno, en una importante corporación bancaria brasileña (Banco do Brasil) que es conocida por tener uno de los programas de banca doméstica más seguros y eficientes del mundo, simplemente ponen historia.ir (1) en cada page.So, si pulsa el botón atrás, se le devolverá. Simple.

 0
Author: Ivan Bosnic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-15 18:13:40

Por favor, busque en los encabezados de respuesta HTTP. La mayoría del código ASP que la gente está publicando parece estar configurándolos. Asegúrate.

El libro de ardillas de O'Reilly es la biblia de HTTP, y El libro de HTTP de Chris Shiflett también es bueno.

 0
Author: Andy Lester,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-20 06:00:40

Puede hacer que la página web con el sensible sea devuelta como un HTTP POST, entonces en la mayoría de los casos los navegadores le darán el mensaje preguntando si desea volver a enviar los datos. (Desafortunadamente no puedo encontrar una fuente canónica para este comportamiento.)

 0
Author: Ed Griebel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-06 16:17:25

Acabo de tener el ejemplo bancario en mente.

La página de mi banco tiene esto en ella:

<meta http-equiv="expires" content="0" />

Esto debería ser sobre esto, supongo.

 0
Author: User,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-20 09:48:58