2008-10-05 24 views
20

en el Apple developer faq¿Cómo configuro las cookies desde dominios externos dentro de iframes en Safari?

barcos de Safari con una política de cookies conservadora que limita la galleta escribe solamente a las páginas elegidas ("navegado") por parte del usuario.

De forma predeterminada, Safari solo permite las cookies de los sitios a los que navega directamente. (es decir, si hace clic en los enlaces con la url de ese nombre de dominio).

Esto significa que si carga una página de su propio sitio con un iFrame con una página de otro sitio, ese otro sitio no puede establecer cookies. (por ejemplo, un ticketshop). Tan pronto como haya visitado el otro dominio directamente, el otro sitio podrá acceder y cambiar sus propias cookies.

Sin tener acceso al código en el otro sitio, ¿cómo puedo hacer que la experiencia del usuario sea lo menos intrusiva posible?

¿Hay alguna forma (javascript?) De verificar si las cookies del otro sitio ya están configuradas y, en consecuencia, mostrar primero un enlace directo al otro sitio, si es necesario?

Actualización:

La función HTML5 'window.postMessage' parece ser una buena solución.
Existen algunas bibliotecas jQuery que pueden ser útiles y compatibles con los navegadores más recientes.
En esencia, el documento iFrame envía mensajes, con Json, a través del elemento ventana.

La muy buena Postmessage-plugin, por daepark, que conseguí trabajando.
y otro jQuery postMessage, por Ben Alman encontré, pero no he probado.

+0

También veo este problema, pero creo que el problema está limitado a las cookies no seguras. ¿Alguien puede confirmar? – Adam

Respuesta

8

Este es un problema conocido como Política de Same Origin. Esencialmente es una medida de seguridad contra la creación de lagunas de seguridad.

Cuando tiene un iframe que apunta a una página en su propio dominio, JavaScript puede acceder tanto a la página en la que se encuentra como a la página dentro del Iframe. Esta es una relación aceptable de padre a hijo y de padre a hijo.

(parent doc)  (iframe doc) 
    HTML --> IFRAME <-- HTML 
     ^--------|---------^ 

Sin embargo, una vez que tenga un archivo que apunta a una página externa, SOP entra en juego y haults cualquier información que pasa entre la página principal y la página de marco flotante.

(parent doc)  (iframe doc) 
    HTML --> IFRAME <-- HTML 
       X 

¡Mira esta publicación sobre la comunicación iframe, tiene mucho sentido! Stackoverflow post

¡Estos enlaces realmente ayudan también!

1)Secure Cross-Domain Communication in the Browser
2)wiki SOP or Same Origin Policy

Buena suerte!

+0

nvm su respuesta es un poco demasiado general pero tiene un punto. SOP le impedirá verificar si las cookies existen también. O debería, de todos modos. – wds

+0

Mi solución actual es cargar primero una página local dentro del iframe, con un enlace a la página externa. De esta forma, el visitante debe "navegar" hacia esa página y luego las cookies están permitidas para ese sitio. Lo que estoy buscando es una forma de saber si la página externa ya tiene privilegios de cookies, por lo que podría omitir primero cargar la página local y mostrar directamente la página externa. – GDmac

3

This page sugiere que coloque algunos javascript en sus páginas que detecten la ausencia de una cookie siempre disponible. Cuando descubre que la cookie no se ha establecido, publica los datos de sesión requeridos en una página que configura la cookie y lo redirige a la página de origen.

Aparentemente, el POST es suficiente para satisfacer la prueba de Safari de "he navegado a este dominio", por lo que a partir de ese momento acepta las cookies de ese dominio.

Por supuesto, no es el mejor código, pero puede resolver su problema.

2

Una solución (un poco desordenada) podría ser que la página padre verifique la presencia de la cookie y, si la cookie no está presente, ejecute una llamada AJAX a una secuencia de comandos en el dominio de la página iframe que establece la cookie.

+1

¿Alguien ha intentado esto (con un POSTE AJAX en lugar de un POST de actualización de página completa)? ¿Es suficiente? –

+0

No pude hacer funcionar un AJAX POST, pero en realidad puedes hacerlo con un simple GET/redirigir a donde estabas. Vea esta respuesta y mi comentario al respecto: http://stackoverflow.com/a/15889674/361609 – colllin

2

Este es un problema común con las aplicaciones de Facebook que se muestran en Safari. La forma en que muchos (incluyéndome a mí) se han ocupado de esto es tener la página iframed POST a sí misma. Cuando una página ha publicado datos del formulario, se le permite establecer cookies. Al final, funciona con una actualización de 1 página, que incluso podría ser su usuario POST de inicio de sesión.

10

localStorage, soportado por safari y todos los navegadores modernos, permite operaciones de lectura/escritura incluso en páginas cargadas en iframes. si no le importa dejar caer soporte para ie6 y ie7, intente utilizar localStorage en lugar de cookies en su sitio enmarcado. Sé que su pregunta dice específicamente que no tiene acceso al código en el sitio enmarcado, pero para aquellos que lo hacen, localStorage definitivamente resuelve el problema de "no cookies en un iframe de safari".

+0

+1 para el enfoque de futuro de pensamiento futuro – Paul

Cuestiones relacionadas