Cookie bloqueada/no guardada en IFRAME en Internet Explorer

Resuelto Piskvor left the building asked hace 15 años • 22 respuestas

Tengo dos sitios web, digamos que son example.comy anotherexample.net. En anotherexample.net/page.html, tengo un IFRAME SRC="http://example.com/someform.asp". Ese IFRAME muestra un formulario para que el usuario lo complete y lo envíe http://example.com/process.asp. Cuando abro el formulario (" someform.asp") en su propia ventana del navegador, todo funciona bien. Sin embargo, cuando lo cargo someform.aspcomo IFRAME en IE 6 o IE 7, las cookies de example.com no se guardan. En Firefox este problema no aparece.

Para fines de prueba, creé una configuración similar en http://newmoon.wz.cz/test/page.php .

example.comutiliza sesiones basadas en cookies (y no hay nada que pueda hacer al respecto), por lo que sin cookies, process.aspno se ejecutará. ¿Cómo fuerzo a IE a guardar esas cookies?

Resultados de rastrear el tráfico HTTP: en la respuesta GET /someform.asp, hay un encabezado Set-Cookie válido por sesión (por ejemplo Set-Cookie: ASPKSJIUIUGF=JKHJUHVGFYTTYFY), pero en la solicitud POST /process.asp, no hay ningún encabezado de Cookie.

Edición 3: algunas secuencias de comandos del lado del servidor AJAX+ aparentemente son capaces de evitar el problema, pero eso se parece mucho a un error y además abre un conjunto completamente nuevo de agujeros de seguridad . No quiero que mis aplicaciones utilicen una combinación de error y agujero de seguridad sólo porque es fácil.

Editar: la política P3P fue la causa principal , explicación completa a continuación.

Aceptado

Lo hice funcionar, pero la solución es un poco compleja, así que tengan paciencia.

Lo que está sucediendo

Tal como están las cosas, Internet Explorer otorga un menor nivel de confianza a las páginas IFRAME (IE llama a esto contenido de "terceros"). Si la página dentro del IFRAME no tiene una Política de Privacidad, sus cookies están bloqueadas (lo cual se indica con el ícono del ojo en la barra de estado, cuando haces clic en él, te muestra una lista de URL bloqueadas).

El ojo maligno
(fuente: piskvor.org )

En este caso, cuando se bloquean las cookies, no se envía el identificador de sesión y el script de destino arroja un error de "sesión no encontrada".

(Intenté configurar el identificador de sesión en el formulario y cargarlo desde las variables POST. Esto habría funcionado , pero por razones políticas no pude hacerlo).

Es posible hacer que la página dentro del IFRAME sea más confiable: si la página interna envía un encabezado P3P con una política de privacidad que sea aceptable para IE, las cookies serán aceptadas .

Cómo resolverlo

Crear una política p3p

Un buen punto de partida es el tutorial del W3C . Lo revisé, descargué el Editor de políticas de privacidad de IBM y allí creé una representación de la política de privacidad y le di un nombre para hacer referencia a ella (aquí estaba policy1).

NOTA : en este punto, usted realmente necesita averiguar si su sitio tiene una política de privacidad y, en caso contrario, crearla: si recopila datos del usuario, qué tipo de datos, qué hace con ellos, quién tiene acceso a ellos, etc. Necesita encontrar esta información y pensar en ella. Simplemente juntar algunas etiquetas no será suficiente. Este paso no se puede realizar únicamente en software y puede ser muy político (por ejemplo, "¿deberíamos vender nuestras estadísticas de clics?").

(por ejemplo, "el sitio es operado por ACME Ltd., utiliza identificadores anónimos por sesión para su funcionamiento, recopila datos del usuario solo si se permite explícitamente y solo para los siguientes propósitos, los datos se almacenan solo durante el tiempo necesario, solo nuestra empresa tiene acceso a él, etc., etc.").

(Al editar con esta herramienta, es posible ver errores/omisiones en la política. También es muy útil la pestaña "Política HTML": en la parte inferior, tiene una "Evaluación de política" - una verificación rápida si la política será bloqueada por la configuración predeterminada de IE)

El editor exporta a un archivo .p3p, que es una representación XML de la política anterior. Además, puede exportar una "versión compacta" de esta política.

Enlace a la política

http://example.com/w3c/p3p.xmlLuego se necesitaba un archivo de referencia de políticas ( ) (un índice de políticas de privacidad que utiliza el sitio):

<META>
  <POLICY-REFERENCES>
    <POLICY-REF about="/w3c/example-com.p3p#policy1">
      <INCLUDE>/</INCLUDE>
      <COOKIE-INCLUDE/>
    </POLICY-REF>
  </POLICY-REFERENCES>
</META>

Muestra <INCLUDE>todos los URI que utilizarán esta política (en mi caso, todo el sitio). El archivo de política que exporté desde el Editor se cargó enhttp://example.com/w3c/example-com.p3p

Envíe el encabezado compacto con las respuestas.

Configuré el servidor web en example.com para enviar el encabezado compacto con respuestas, como esta:

HTTP/1.1 200 OK 
P3P: policyref="/w3c/p3p.xml", CP="IDC DSP COR IVAi IVDi OUR TST"
// ... other headers and content

policyrefes un URI relativo al archivo de referencia de políticas (que a su vez hace referencia a las políticas de privacidad), CPes la representación compacta de la política. Tenga en cuenta que la combinación de encabezados P3P en el ejemplo puede no ser aplicable en su sitio web específico; ¡sus encabezados P3P DEBEN representar fielmente su propia política de privacidad!

¡Ganancia!

En esta configuración no aparece el Mal de Ojo, las cookies se guardan incluso en el IFRAME y la aplicación funciona.

Editar: Qué NO hacer, a menos que le guste defenderse de demandas

Varias personas han sugerido "simplemente coloque algunas etiquetas en su encabezado P3P, hasta que el Mal de Ojo se rinda".

Las etiquetas no son sólo un montón de bits, tienen significados en el mundo real y su uso le otorga responsabilidades en el mundo real .

Por ejemplo, fingir que nunca recopila datos del usuario puede hacer feliz al navegador, pero si realmente recopila datos del usuario, el P3P está en conflicto con la realidad. Simple y llanamente, estás mintiendo intencionalmente a tus usuarios , y eso podría ser un comportamiento criminal en algunos países. Como en "ve a la cárcel, no cobres 200 dólares".

Algunos ejemplos ( consulte p3pwriter para ver el conjunto completo de etiquetas ):

  • NOI : "El sitio web no recopila datos de identificación". (Tan pronto como haya alguna personalización, un inicio de sesión o cualquier recopilación de datos (***** Analytics, ¿alguien?), debe reconocerlo en su P3P)
  • STP : La información se conserva para cumplir con el propósito declarado. Esto requiere que la información se descarte lo antes posible. Los sitios DEBEN tener una política de retención que establezca un cronograma de destrucción. La política de retención DEBE incluirse o vincularse desde la política de privacidad legible por humanos del sitio". (Por lo tanto, si envía STPpero no tiene una política de retención, puede estar cometiendo fraude. ¿Qué tan bueno es eso? En absoluto.)

No soy abogado, pero no estoy dispuesto a ir a los tribunales para ver si el encabezado P3P es realmente vinculante legalmente o si puedes prometer algo a tus usuarios sin estar realmente dispuesto a cumplir tus promesas.

Piskvor left the building avatar Dec 23 '2008 17:12 Piskvor left the building

He pasado gran parte de mi día investigando esto del P3P y siento la necesidad de compartir lo que descubrí.

Me he dado cuenta de que el concepto P3P está muy desactualizado y parece que sólo Internet Explorer (IE) lo utiliza/aplica realmente.

La explicación más simple es: IE quiere que definas un encabezado P3P si estás usando cookies.

Esta es una buena idea y, afortunadamente, la mayoría de las veces, no proporcionar este encabezado no causará ningún problema (lea las advertencias del navegador). A menos que su sitio web/aplicación web se cargue en otro sitio web mediante un (i)Frame. Aquí es donde IE se convierte en un enorme dolor de cabeza. No le permitirá configurar una cookie a menos que esté configurado el encabezado P3P.

Sabiendo esto quería encontrar una respuesta a las siguientes dos preguntas:

  1. ¿A quién le importa? En otras palabras, ¿me pueden demandar si pongo la palabra "Patata" en el encabezado?
  2. ¿Qué hacen otras empresas?

Mis hallazgos son:

  1. A nadie le importa. No puedo encontrar un solo documento que sugiera que esta tecnología tenga algún peso legal. Durante mi investigación no encontré ni un solo país en el mundo que haya adoptado una ley que impida poner la palabra "Patata" en el encabezado P3P.
  2. Tanto Google como Facebook colocan un enlace en su campo de encabezado P3P que hace referencia a una página que describe por qué no tienen un encabezado P3P.

El concepto nació en 2002 y me desconcierta que este concepto obsoleto y legalmente no implementado todavía se imponga a los desarrolladores dentro de IE. Si este encabezado no tiene ramificaciones legales, debe ignorarse (o, alternativamente, generar una advertencia o notificación en la consola). ¡No aplicado! Ahora me veo obligado a poner una línea en mi código (y enviar un encabezado al cliente) que no hace absolutamente nada.

En resumen, para mantener contento a IE, agregue la siguiente línea a su código PHP (otros idiomas deberían ser similares)

header('P3P: CP="Potato"');

Problema resuelto y IE está contento con esta papa.

Ruben avatar May 10 '2013 04:05 Ruben

Pude hacer que el mal de ojo desapareciera simplemente agregando este pequeño encabezado al sitio en el IFrame (solución PHP):

header('P3P: CP="NOI ADM DEV COM NAV OUR STP"');

Recuerde presionar Ctrl+F5 para recargar su sitio o el Explorador aún puede mostrar el mal de ojo, a pesar de que esté funcionando bien. Esta es probablemente la razón principal por la que tuve tantos problemas para que funcionara.

No era necesario ningún archivo de política.

Editar: encontré una buena entrada de blog que explica el problema con las cookies en IFrames. También tiene una solución rápida en código C#: Marcos, Páginas ASPX y Cookies Rechazadas.

Helo avatar Feb 19 '2010 15:02 Helo

Esto está oculto en los comentarios de otras respuestas, pero casi me lo pierdo, por lo que parece que merece su propia respuesta.

Para revisar: para que IE acepte cookies de terceros, debe entregar sus archivos con un encabezado http llamado p3p en el formato:

CP="my compact p3p policy"

PERO, p3p está prácticamente muerto como estándar en este momento y puedes hacer que IE funcione fácilmente sin invertir tiempo y recursos legales en crear una política p3p real. Esto se debe a que si el encabezado de su política p3p compacta no es válido, IE en realidad la trata como una buena política y acepta cookies de terceros. Entonces puedes usar un encabezado p3p como este

CP="This site does not have a p3p policy."

Opcionalmente puedes incluir un enlace a una página que explique por qué no tienes una política p3p, como sí la tienen Google y Facebook (apuntan aquí: https://support.google.com/accounts/answer/151657 y aquí: https https://www.facebook.com/help/327993273962160/ ).

Finalmente, es importante tener en cuenta que todos los archivos servidos desde el sitio de terceros deben tener el encabezado p3p, no solo el que establece la cookie, por lo que es posible que no pueda hacer esto simplemente en PHP, asp.net, etc. código. Probablemente sea mejor configurarlo en el nivel del servidor web (es decir, en IIS o Apache).

 avatar May 24 '2013 14:05