2008-11-04 9 views
44

Veo que el truco iframe/p3p es el más popular, pero personalmente no me gusta porque javascript + hidden fields + frame realmente hace que parezca un trabajo de hackeo. También he encontrado un enfoque maestro-esclavo que usa el servicio web para comunicarse (http://www.15seconds.com/issue/971108.htm) y parece mejor porque es transparente para el usuario y es robusto contra diferentes navegadores.¿Cuál es su enfoque de intercambio de cookies de dominio cruzado favorito?

¿Hay mejores enfoques y cuáles son los pros y los contras de cada uno?

Respuesta

57

Mi enfoque designa un dominio como dominio "central" y cualquier otro como dominios "satélite".

Cuando alguien hace clic en un enlace de inicio de sesión (o presenta una cookie de inicio de sesión persistente), el formulario de inicio de sesión envía finalmente sus datos a una URL que está en el dominio central, junto con un elemento de formulario oculto que indica el dominio vino de (solo por conveniencia, por lo que el usuario es redirigido hacia atrás).

Esta página en el dominio central luego establece una cookie de sesión (si el inicio de sesión fue bien) y redirige a cualquier dominio desde el que el usuario inició sesión, con un token especialmente generado en la URL única para esa sesión .

La página en la URL del satélite verifica ese token para ver si corresponde a un token que se generó para una sesión, y si es así, se redirige a sí mismo sin el token y establece una cookie local. Ahora ese dominio satelital también tiene una cookie de sesión. Esta redirección borra el token de la URL, por lo que es poco probable que el usuario o cualquier rastreador grabe la URL que contiene ese token (aunque si lo hicieran, no debería importar, el token puede ser un token de uso único).

Ahora, el usuario tiene una cookie de sesión tanto en el dominio central como en el satélite. Pero, ¿y si visitan otro satélite? Bueno, normalmente, parecerían al satélite como no autenticado.

Sin embargo, a lo largo de mi aplicación, cada vez que un usuario está en una sesión válida, todos los enlaces a páginas en los otros dominios de satélite tienen un? S o & s adjuntados a ellos. Reservo esta cadena de consulta 's' para indicar "verificar con el servidor central porque consideramos que este usuario tiene una sesión". Es decir, no se muestra ningún id. De token o sesión en ninguna página HTML, solo la letra "s" que no puede identificar a alguien.

Una URL que reciba dicha etiqueta de consulta 's', si aún no hay una sesión válida, redirige al dominio central diciendo "¿me puede decir quién es?" poniendo algo en la cadena de consulta.

Cuando el usuario llega al servidor central, si están autenticados allí, el servidor central simplemente recibirá su cookie de sesión. Luego enviará al usuario de vuelta al satélite con otro token de uso único, que el satélite tratará como un satélite después de iniciar sesión (ver arriba). Es decir, el satélite ahora configurará una cookie de sesión en ese dominio y se redireccionará a sí mismo para eliminar el token de la cadena de consulta.

Mi solución funciona sin script o soporte iframe. Requiere '' s 'agregarse a cualquier URL entre dominios donde el usuario aún no tenga una cookie en esa URL. Pensé en una forma de evitar esto: cuando el usuario primero inicia sesión, configura una cadena de redireccionamientos alrededor de cada dominio, configurando una cookie de sesión en cada uno. La única razón por la que no he implementado esto es que sería complicado en el sentido de que necesitaría tener un orden establecido para que estas redirecciones ocurrieran y cuándo detenerse, y evitaría que se expanda más allá de 15 dominios o más (demasiados más y te vuelves peligrosamente cercano al 'límite de redirección' de muchos navegadores y servidores proxy).

+7

Esto es muy similar a oauth2. Usted ha colocado el inicio de sesión automático encima, que es una buena opción si posee todas las aplicaciones. – matthuhiggins

+0

Buena respuesta, pero tengo algunas consideraciones sobre su respuesta: 1) No necesita pasar la url satelital como retorno, puede usar el encabezado HTTP url-referer para esto. 2) Tu token de devolución no es seguro, incluso si se trata de un token de uso único, un atacante puede interceptar la devolución de devolución y usar el token fuera de la aplicación de llamada antes de que se complete la validación, el enfoque correcto es generar un código de seguridad en esclavo y validar el token con este código en el dominio central, el token es público pero es inútil para el atacante sin el código de seguridad. –

+0

3) si utiliza un servidor de estado completo (información de usuario almacenada en la memoria o base de datos), no necesita cambiar la URL para verificar primero el inicio de sesión, porque el atacante puede cambiar la URL en el lado del cliente, el cheque debe hacerse en cada solicitud, incluso sin la consulta en url. Entonces, cuando un usuario solicita una url segura, comprueba si el usuario se autenticó (información de usuario en la memoria) y si la autenticación sigue siendo válida (después de x horas de inicio de sesión), de lo contrario, lo redirecciona al servidor de inicio de sesión nuevamente. –

2

Esa es una buena solución si tiene control total de todos los dominios back-end. En mi situación solo tengo control de cliente (javascript/html) en uno, y control total en otro, por lo tanto necesito usar el método iframe/p3p, que apesta :(.

0

Usamos el encadenamiento de cookies, pero es no es una buena solución ya que se rompe cuando uno de los dominios no funciona para el usuario (debido a filtraciones/firewalls, etc.). Las técnicas más nuevas (incluida la suya) solo se rompen cuando el servidor "maestro" que entrega las cookies/gestiona los inicios de sesión se rompe.

en cuenta que su return.asp se puede abusar para redirigir a cualquier sitio (ver this por ejemplo).

0

autorización I parecen haber encontrado una solución, puede crear una etiqueta de script que las cargas el src del do principal que desea establecer/obtener cookies ... solo Safari hasta ahora parece no poder configurar cookies, pero Ie6 y FF funcionan bien ... aún si solo quiere obtener cookies, este es un muy buen enfoque.

+0

Safari tiene una preferencia de aceptación de cookies predeterminada que solo le permite aceptar las cookies a las que el usuario ha navegado. Chrome y Safari comparten el mismo motor subyacente (WebKit) pero Chrome tiene esta propiedad establecida en "Aceptar todo". Dejando a un lado los niveles de argumentos de seguridad predeterminados, esta puede ser la razón por la cual Safar no funciona en su arreglo. – ScottCher

1

El ejemplo en ese artículo me parece sospechoso porque básicamente redirige a una url que, a su vez, devuelve las variables a su dominio en una cadena de consulta.

En el ejemplo, esto significaría que un usuario malintencionado podría simplemente navegar a http://slave.com/return.asp?Return=blah&UID=123 "y se conectó por slave.com como usuario 123.

Me estoy perdiendo algo, o es bien conocido que este la técnica es insegura y no debe usarse, bueno, cosas como ese ejemplo sugiere (pasar las identificaciones de usuario, presumiblemente para hacer portátil la identidad).

+0

¿Alguien tiene una respuesta a esta pregunta? ¡Parece que esto sería importante saber antes de aplicar la respuesta seleccionada! – streetlight

+0

No, porque el maestro debe enviar un token único con la redirección que el satélite puede validar. Cabe señalar, al igual que con todos los mecanismos de autenticación HTTP, que solo se debe usar https. No es muy diferente de lo que oauth2 hace. – ashwoods

-3

Lo que hace es en el dominio que recibe las variables que verifica la referencia dirección también para que pueda confirmar que el enlace era de su propio dominio y no alguien simplemente escribiendo el enlace en la barra de direcciones. Este enfoque funciona bien.

+9

referente se puede fingir en cualquier momento – tamasd

0

También debe validar la información de la sesión activa contra los dominios b, c, d, ... de esta manera solo puede iniciar sesión si el usuario ya inició sesión en el dominio a.

1

@thomasrutter

Se podría evitar tener que gestionar todos los enlaces salientes de los satélites (a través añadiendo "s" a la cadena de consulta) al hacer una llamada AJAX para comprobar el dominio 'central' para el estado de autenticación al cargar la página. Podría evitar las llamadas redundantes (en las siguientes cargas de página) haciendo solo una por sesión.

Podría ser mejor hacer la solicitud de verificación de autenticación del servidor antes de la carga de la página para que (a) tenga un acceso más eficiente a la sesión, y (b) sabrá en la página si el usuario está conectado (y muestra el contenido en consecuencia).

+0

1. Estamos hablando de dominio cruzado, por lo que AJAX no es una opción por defecto 2. No se puede verificar en el servidor sin redirección, ya que no tiene nada que identificar al usuario. –

Cuestiones relacionadas