2012-01-31 10 views
9

Tengo una aplicación web que es utilizada por muchos usuarios no técnicos. He descubierto que varios de estos usuarios están guardando la página de inicio de sesión de la aplicación en sus escritorios (que también guarda los archivos CSS y JS asociados). Luego, para comenzar a usar la aplicación, hacen doble clic en el icono del escritorio que muestra la copia local usando el protocolo file: //.¿Cómo evitar que los usuarios accedan a una aplicación web desde una página de inicio de sesión Html guardada localmente?

Esto puede causar problemas más adelante, p. si cambio el formulario de inicio de sesión, o la URL a la que publica, etc. También, ciertas utilidades de JavaScript, p. PIE.htc no funciona usando el protocolo file: //.

Obviamente, lo que deberían hacer es guardar un marcador/favorito del navegador, estoy buscando una forma de detectar y advertir a esos usuarios sin confundir el resto. He estado usando algunos javascript para advertir a estos usuarios:

if (top.location.protocol == 'file:') { 
    alert('This application is not designed to be accessed from a desktop copy...') 
} 

Pero esto sólo advertir a los usuarios que han salvado la copia de escritorio ya que he añadido este fragmento de código JavaScript.

¿Alguien más ha tenido este problema y ha encontrado soluciones inteligentes que les gustaría compartir?

Gracias

Actualización:

Al final he decidido hacer esto mediante el establecimiento de una cookie con un valor nonce a petición página de inicio de sesión, y almacenar el mismo valor que un campo oculto en la forma . Luego, en el controlador de envío de formularios, compruebe que los dos son iguales y muestre un mensaje de error si no es así. Uno podría almacenar el nonce en una sesión en lugar de una cookie, pero no quiero crear sesiones innecesarias.

Si el usuario ha guardado la página de inicio de sesión localmente, es probable que tenga diferentes valores nonce en el formulario guardado en comparación con la cookie (si tienen una cookie).

Normalmente, uno no agregaría la protección CSRF (que es una especie de esto) a un formulario de inicio de sesión, pero cumple mis requisitos. Leí sobre esta técnica en The Register, http://www.theregister.co.uk/2009/10/02/google_web_attack_protection/, Google implementó una protección similar para sus formularios de inicio de sesión, para proteger contra la falsificación de solicitudes de inicio de sesión, http://en.wikipedia.org/wiki/Cross-site_request_forgery#Forging_login_requests.

Respuesta

1

¿Quizás las cookies? Si el sitio se está ejecutando con file:\\ probablemente no haya cookies dentro de la solicitud. (Por supuesto, ahora debe agregar algunas cookies (datos de sesión) en su página de inicio de sesión.

Además, lea sobre CSRF http://en.wikipedia.org/wiki/Cross-site_request_forgery y el método de prevención.

+1

Es cierto que no habrá cookies en la copia guardada. Así que puedo configurar la cookie en el formulario de inicio de sesión y verificar su presencia después de iniciar sesión, en la página del menú, ¡lindo! –

+0

¿Sugiere usar un token CSRF dependiente del tiempo enviado desde la página de inicio de sesión al controlador de inicio de sesión? Supongo que, al igual que con la protección CSRF, estoy intentando detectar solicitudes que no provienen de mi aplicación, por lo que probablemente esto también funcione. Probaré tus sugerencias e informaré. –

1

Probablemente pueda consultar la referencia http del lado del servidor y advertir a los usuarios que no provengan de su formulario de inicio de sesión alojado.

Editar:

En realidad, una pregunta vagamente similar se ha hecho antes y conseguimos una buena explicación de por qué el Referente no es una solución ideal y también proporciona una solución alternativa: How to check if a request if coming from the same server or different server?

+0

Lo había intentado, parecía la solución ideal, pero parece que IE y Chrome (los que probé) no envían la referencia al pasar del archivo: // a http: // –

+1

No es Es seguro asumir que una solicitud con una referencia vacía no proviene de su formulario de inicio de sesión a menos que el usuario haya alterado el comportamiento predeterminado de su navegador. Si le preocupa molestar a sus usuarios, puede advertirles una vez y nunca más después de que confirmen que entendieron las implicaciones. – Till

+0

Una buena idea, comprobar la ausencia de referencia podría funcionar (pero también causar algunos falsos positivos, por ejemplo, el usuario ingresó una URL una vez que inició sesión), desafortunadamente he tenido problemas para trabajar con el encabezado de referencia en el pasado en este aplicación: muchos usuarios están sentados detrás de firewalls corporativos que despojan al encabezado de referencia como una medida de seguridad en cualquier caso. Si no resuelvo esto, aceptaré su respuesta –

0

En lugar de mensaje que puede redirigir su usuario a la página real que tiene el formulario de inicio de sesión, o mostrar el cuadro de ayuda que explicará que el usuario debe guardar la página de esa manera.

2

Creo que su mejor apuesta será educar a los usuarios a usar marcadores en lugar de guardar archivos físicos.

Aparte de eso, ¿hay alguna manera de crear un acceso directo a su URL, quizás durante el inicio de sesión?

+0

Esa es una buena idea, he visto sitios que tienen enlaces 'Añadir marcador' (que probablemente usan javascript). Probablemente implementaré esto, pero en este punto debo advertir a los usuarios existentes que ya lo han hecho. –

1

¿Por qué, usted no, en lugar de la alerta, ponga un redireccionamiento a su página?

window.location = 'http://www.yourdomain.com' 

O también puede forzar una recarga con window.location.reload();

+0

La pregunta indicaba que la página HTML ya había sido guardada por el cliente, por lo que no se puede modificar. Esperaba detectar qué usuarios estaban accediendo a la vista a través de una copia guardada localmente. Además, al volver a cargar la página file: // simplemente se volvería a cargar la copia local –

0

Se podría establecer una variable de sesión que se establece como una variable oculta en la forma. Si eso no está allí, redirige a su formulario de inicio de sesión.

Cuestiones relacionadas