Tengo dos sitios web, digamos que son example.com
y 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 cargo someform.asp
como 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, he creado una configuración similar en http://newmoon.wz.cz/test/page.php .
example.com
utiliza sesiones basadas en cookies (y no hay nada que pueda hacer al respecto), por lo que sin cookies process.asp
no se ejecutará. ¿Cómo fuerzo a IE a guardar esas cookies?
Resultados de detectar 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 Cookie.
Edit3: algunas secuencias de comandos del servidor AJAX + aparentemente son capaces de eludir el problema, pero eso se parece mucho a un error, además de que abre un nuevo conjunto de agujeros de seguridad . No quiero que mis aplicaciones usen una combinación de error + agujero de seguridad solo porque es fácil.
Editar: la política P3P fue la causa raíz , la explicación completa a continuación.
fuente
Respuestas:
Lo puse a trabajar, pero la solución es un poco compleja, así que tengan paciencia conmigo.
Qué esta pasando
Tal como están las cosas, Internet Explorer otorga un nivel de confianza más bajo a las páginas IFRAME (IE llama a este 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 mediante el icono del ojo en la barra de estado, cuando hace clic en él, le muestra una lista de URL bloqueadas).
(fuente: piskvor.org )
En este caso, cuando se bloquean las cookies, el identificador de sesión no se envía y el script de destino arroja un error 'sesión no encontrada'.
(Intenté configurar el identificador de sesión en el formulario y cargarlo desde las variables POST. Esto hubiera 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, se aceptarán las cookies .
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, en realidad necesita saber si su sitio tiene una política de privacidad y, de no ser así, 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 ello. Simplemente golpeando unas pocas 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 de usuario solo si está explícitamente permitido y solo para los siguientes propósitos, los datos se almacenan solo el tiempo que sea 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
Luego
http://example.com/w3c/p3p.xml
se necesitaba un archivo de referencia de política ( ) (un índice de políticas de privacidad que usa el sitio):Los
<INCLUDE>
espectáculos de todos los URI que utilizarán esta política (en mi caso, todo el sitio). El archivo de política que exporté del Editor se cargó enhttp://example.com/w3c/example-com.p3p
Enviar el encabezado compacto con respuestas
He configurado el servidor web en example.com para enviar el encabezado compacto con respuestas, como esta:
policyref
es un URI relativo al archivo de referencia de políticas (que a su vez hace referencia a las políticas de privacidad),CP
es la representación compacta de políticas. 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 sinceramente su propia política de privacidad!¡Lucro!
En esta configuración, Evil Eye no aparece, las cookies se guardan incluso en el IFRAME y la aplicación funciona.
Editar: Qué NO hacer, a menos que te guste defenderte de los juicios
Varias personas han sugerido "simplemente colocar algunas etiquetas en su encabezado P3P, hasta que Evil Eye se rinda".
¡Las etiquetas no son solo un montón de bits, tienen significados del mundo real y su uso le otorga responsabilidades en el mundo real !
Por ejemplo, fingir que nunca recopila datos de usuario puede hacer feliz al navegador, pero si realmente recopila datos de usuario, el P3P está en conflicto con la realidad. Claro y simple, estás mintiendo a propósito a tus usuarios , y eso podría ser un comportamiento criminal en algunos países. Como en "ir a la cárcel, no cobrar $ 200".
Algunos ejemplos ( ver p3pwriter para el conjunto completo de etiquetas ):
STP
pero no tiene una política de retención, puede estar cometiendo fraude. ¿Qué tan genial es eso?No soy abogado, pero no estoy dispuesto a ir a la corte para ver si el encabezado P3P es realmente legalmente vinculante o si puede prometerle algo a sus usuarios sin estar realmente dispuesto a cumplir sus promesas.
fuente
He pasado gran parte de mi día investigando esta cuestión de P3P y siento la necesidad de compartir lo que he descubierto.
Me he dado cuenta de que el concepto P3P está muy desactualizado y parece que Internet Explorer (IE) solo lo utiliza realmente.
La explicación más simple es: IE quiere que defina un encabezado P3P si está utilizando 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 utilizando un (i) Frame. Aquí es donde IE se convierte en un dolor masivo en el ***. No le permitirá configurar una cookie a menos que el encabezado P3P esté configurado.
Sabiendo esto, quería encontrar una respuesta a las siguientes dos preguntas:
Mis hallazgos son:
El concepto nació en 2002 y me desconcierta que este concepto desactualizado y legalmente no implementado todavía se aplique a los desarrolladores dentro de IE. Si este encabezado no tiene ramificaciones legales, este encabezado debe ignorarse (o alternativamente, generar una advertencia o notificación en la consola). No se aplica! 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)
Problema resuelto, y IE está contento con esta papa.
fuente
Potato
en mi P3P lo resolvió. ¡jaja!Pude hacer desaparecer el mal de ojo simplemente agregando este pequeño encabezado al sitio en el IFrame (solución PHP):
Recuerde presionar ctrl + F5 para volver a cargar su sitio o Explorer puede mostrar el mal de ojo, a pesar de que funciona bien. Esta es probablemente la razón principal por la que tuve tantos problemas para que funcione.
Ningún archivo de política era necesario en absoluto.
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 el código C #: marcos, páginas ASPX y cookies rechazadas
fuente
CP="This_is_not_a_privacy_policy"
. Hacer eso parece menos legalmente vinculante, creo (ya que, por ejemplo, se menciona NOI y STP y nada de eso), y aparentemente hace feliz a IE :-)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 servir sus archivos con un encabezado http llamado p3p en el formato:
PERO, p3p está prácticamente muerto como estándar en este punto y puede hacer que IE funcione fácilmente sin invertir el tiempo y los recursos legales en la creación de una política real de p3p. Esto se debe a que si el encabezado de su política compacta p3p no es válido, IE en realidad lo trata como una buena política y acepta cookies de terceros. Entonces puede usar un encabezado p3p como este
Opcionalmente, puede incluir un enlace a una página que explique por qué no tiene una política p3p, como lo hacen Google y Facebook (señalan aquí: https://support.google.com/accounts/answer/151657 y aquí: 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 configura la cookie, por lo que es posible que no pueda hacer esto en su PHP, asp.net, etc. código. Probablemente sea mejor configurarlo en el nivel del servidor web (es decir, en IIS o Apache).
fuente
También tuve este problema, pensé en publicar el código que usé en mi proyecto MVC2. Tenga cuidado cuando en el ciclo de vida de la página agregue el encabezado o obtendrá una HttpException "El servidor no puede agregar el encabezado después de que se hayan enviado los encabezados HTTP ". Usé un ActionFilterAttribute personalizado en el método OnActionExecuting (llamado antes de que se ejecute la acción).
Ejemplo de uso:
fuente
Este es un gran tema sobre el tema, sin embargo, encontré que un detalle importante (que era esencial al menos en mi caso) que no se publicó aquí ni en ningún otro lugar (me disculpo si me lo perdí) fue que la línea P3P debe ser pasó en el encabezado de CADA archivo enviado desde el servidor de terceros, incluso los archivos que no configuran o usan cookies como archivos o imágenes Javascript. De lo contrario, las cookies serán bloqueadas. Tengo más información sobre esto en una publicación aquí: http://posheika.net/?p=110
fuente
Cualquiera que tenga este problema en node.js.
Luego agregue este módulo p3p y habilite este módulo en el middleware.
Estoy usando express, así que lo agrego en app.js
Primero requiere ese módulo en app.js
luego úsalo como middleware
Agregará encabezados p3p en el objeto res. No es necesario hacer nada extra.
Obtendrá más información en:
https://github.com/troygoode/node-p3p
fuente
Si alguien está buscando la línea Apache; Usamos este.
Realmente no importó el valor de CP establecido, siempre y cuando exista el encabezado P3P.
fuente
Una cosa posible es agregar el dominio a los sitios permitidos en herramientas -> opciones de internet -> privacidad -> sitios: somedomain.com -> permitir -> Aceptar.
fuente
Esta publicación ofrece algunos comentarios sobre P3P y una solución abreviada que reduce los problemas con IE7 e IE8.
fuente
Una solución que no he visto aquí, es usar el almacenamiento de sesión en lugar de cookies. Por supuesto, esto podría no satisfacer los requisitos de todos, pero en algunos casos es una solución fácil.
fuente
Estaba investigando este problema con respecto al inicio de sesión a través de los Servicios de control de acceso de Azure, y no pude conectar cabeza y cruz de nada.
Luego, tropecé con esta publicación https://blogs.msdn.microsoft.com/ieinternals/2011/03/10/beware-cookie-sharing-in-cross-zone-scenarios/
En resumen, IE no comparte cookies entre zonas (por ejemplo, Internet vs. sitios de confianza).
Por lo tanto, si su objetivo IFrame y la página html están en diferentes zonas, el P3P no ayudará con nada.
fuente
Tengo un problema similar, también fui a investigar cómo generar la política P3P esta mañana, aquí está mi publicación sobre cómo generar su propia política y usarla en el sitio web :) http://everydayopenslikeaflower.blogspot.com/2009/08/ how-to-create-p3p-policy-and-implement.html
fuente
He implementado una política P3P completa antes, pero no quería volver a la molestia para un nuevo proyecto en el que estaba trabajando. Encontré este enlace útil para una solución simple al problema, solo teniendo que especificar una política P3P compacta mínima de "CAO PSA NUESTRO":
http://blog.sweetxml.org/2007/10/minimal-p3p-compact-policy-suggestion.html
El artículo cita un enlace (ahora roto) a un artículo de Microsoft kb. ¡La política me sirvió!
fuente
También puede combinar los archivos p3p.xml y policy.xml como tales:
/home/ubuntu/sites/shared/w3c/p3p.xml
Encontré que la forma más fácil de agregar un encabezado es proxy a través de Apache y usar mod_headers, como tal:
Por lo tanto, enviamos todas las solicitudes a /w3c/p3p.xml a nuestro servidor de aplicaciones.
Puedes probarlo todo con el validador W3C
fuente
Si posee el dominio que necesita ser incrustado , entonces podría, antes de llamar a la página que incluye el IFrame, redirigir a ese dominio, lo que creará la cookie y redirigirá de nuevo, como se explica aquí: http: //www.mendoweb. be / blog / internet-explorer-safari-third-party-cookie-problem /
Esto funcionará para Internet Explorer pero también para Safari (porque Safari también bloquea las cookies de terceros).
fuente
Sé que es un poco tarde para poner mi contribución en este tema, pero perdí tantas horas que tal vez esta respuesta ayude a alguien.
Intenté llamar a una cookie de terceros en mi sitio y, por supuesto, no funcionaba en Internet Explorer 10, incluso con un nivel de seguridad bajo ... no me pregunten por qué. En el iframe, estaba llamando a read_cookie.php (echo $ _COOKIE) con ajax.
Y no sé por qué no pude establecer la política P3P para resolver el problema ...
Durante mi búsqueda, vi algo acerca de cómo funciona la cookie en JSON. Ni siquiera lo intento porque pensé que si la cookie no pasaría por un iframe, ya no pasaría por una matriz ...
¡Adivina qué, lo hace! Entonces, si codifica su cookie json_ luego decodifica después de su solicitud ajax, ¡la obtendrá!
Tal vez hay algo que me perdí y si lo hice, todas mis disculpas, pero nunca vi algo tan estúpido. Bloquee las cookies de terceros por seguridad, ¿por qué no, pero déjelo pasar si está codificado? ¿Dónde está la seguridad ahora?
Espero que esta publicación ayude a alguien y nuevamente, si me perdí algo y soy tonto, ¡por favor, infórmeme!
fuente
Esto finalmente funcionó para mí (después de mucho apuro y generar algunas políticas utilizando el generador de políticas de IBM). Puede descargar el generador de políticas aquí: http://www.softpedia.com/get/Security/Security-Related/P3P-Policy-Editor.shtml
Ya no pude descargar el generador del sitio web oficial de IBM.
Creé estos archivos en la carpeta raíz de mi aplicación web
fuente
En Rails estoy usando esta gema: https://github.com/merchii/rack-iframe Bawically establece un conjunto de abreviaturas sin un archivo de referencia: https://github.com/merchii/rack-iframe/blob/master /lib/rack/iframe.rb#L8
Es fácil de instalar cuando no te importa en absoluto el significado del material p3p.
fuente
Para cualquiera que intente que la Política compacta P3P funcione con contenido estático:
Es solamente posible si usted es capaz de enviar las cabeceras de respuesta del servidor a medida con el contenido estático.
Para obtener una explicación más detallada, vea mi respuesta aquí: establezca el código P3P en HTML
fuente
En Rails 3.2 estoy usando:
Obtuve esto de: http://dot-net-web-developer-bristol.blogspot.com/2012/04/setting-p3p-header-in-rails-session.html
fuente
Una mejor solución sería hacer una llamada Ajax dentro del iframe a la página que recibiría / establecería cookies ...
fuente