Cookie bloqueada / no guardada en IFRAME en Internet Explorer

Tengo dos sitios web, digamos que son example.com y anotherexample.net . En otro anotherexample.net/page.html , anotherexample.net/page.html / anotherexample.net/page.html , tengo un IFRAME SRC="http://example.com/someform.asp" . Ese IFRAME muestra un formulario para que el usuario complete y envíe a 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 usa sesiones basadas en cookies (y no hay nada que pueda hacer al respecto), de modo que sin cookies, process.asp no se ejecutará. ¿Cómo obligo a IE a guardar esas cookies?

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

Edit3: algunos scripts de 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 utilicen una combinación de error + agujero de seguridad solo porque es fácil.

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

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

    Qué esta pasando

    Tal como están las cosas, Internet Explorer brinda un nivel de confianza más bajo a las páginas de IFRAME (IE llama a este contenido de “terceros”). Si la página dentro de IFRAME no tiene una Política de privacidad, sus cookies están bloqueadas (lo que se indica mediante el icono de ojo en la barra de estado, cuando hace clic en él, le muestra una lista de URL bloqueadas).

    el mal de ojo http://sofes.miximages.com/internet-explorer/cookies_blocked_MSIE_eye.png

    En este caso, cuando las cookies están bloqueadas, el identificador de sesión no se envía, 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 variables POST. Esto habría funcionado , pero por razones políticas no pude hacer eso).

    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 aceptable para IE, las cookies serán aceptadas .

    Cómo resolverlo

    Crea una política p3p

    Un buen punto de partida es el tutorial 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 la policy1 ).

    NOTA : en este punto, realmente necesita averiguar si su sitio tiene una política de privacidad, y si no, crearla, ya sea que recopile datos de usuario, qué tipo de datos, qué hace con ellos, quién tiene acceso a ellos, etc. Necesitas encontrar esta información y pensar en ello. Solo juntar unas pocas tags no lo cortará. Este paso no puede hacerse puramente en software, y puede ser altamente 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 operación, recostack datos de usuario solo si se permite explícitamente 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íticas”, una comprobación rápida si la política se bloqueará). 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 se necesitaba un archivo de referencia de política ( http://example.com/w3c/p3p.xml ) (un índice de políticas de privacidad que usa el sitio):

        /     

    El muestra todos los URI que usarán esta política (en mi caso, todo el sitio). El archivo de política que he exportado del Editor se ha subido a http://example.com/w3c/example-com.p3p

    Enviar el encabezado compacto con respuestas

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

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

    policyref es un URI relativo al archivo de referencia de política (que a su vez hace referencia a las políticas de privacidad), CP es la representación de política compacta. 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!

    ¡Lucro!

    En esta configuración, Evil Eye no aparece, las cookies se guardan incluso en IFRAME y la aplicación funciona.

    Editar: lo que NO debes hacer, a menos que te guste defenderse de demandas

    Varias personas han sugerido “simplemente colocar algunas tags en su encabezado P3P, hasta que Evil Eye se rinda”.

    Las tags no son solo un montón de bits, tienen un significado real en el mundo real , ¡y su uso te da responsabilidades en el mundo real !

    Por ejemplo, fingir que nunca recostacks datos de usuarios puede hacer que el navegador sea feliz, pero si realmente recostacks datos de usuarios, el P3P está en conflicto con la realidad. Claro y simple, está mintiendo a propósito a sus 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 ( vea p3pwriter para el conjunto completo de tags ):

    • NOI : “El sitio web no recostack los datos identificados”. (tan pronto como haya personalización, inicio de sesión o recostackción de datos (***** Analytics, ¿alguien?), debe confirmarlo 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 una tabla de tiempo de destrucción. La política de retención DEBE incluirse o vincularse desde la política de privacidad legible por el usuario del sitio. “(Por lo tanto, si envía STP pero no tiene una política de retención, puede estar cometiendo un fraude. ¿Qué tan bueno es eso? No, en absoluto).

    No soy abogado, pero no estoy dispuesto a ir a la corte para ver si el encabezado P3P es legalmente vinculante o si puede prometer algo a sus usuarios sin estar dispuesto a cumplir sus promesas.

    Pasé gran parte de mi día investigando esta cuestión de 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 realmente se usa / aplica por Internet Explorer (IE).

    La explicación más simple es: IE quiere que defina un encabezado P3P si está 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 utilizando un (i) Marco. Aquí es donde IE se convierte en un dolor masivo en el ***. No le permitirá establecer una cookie a menos que se establezca el encabezado P3P.

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

    1. ¿A quien le importa? En otras palabras, ¿puedo ser demandado si coloco la palabra “Patata” en el encabezado?
    2. ¿Qué hacen otras compañías?

    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é ningún país en el mundo que haya adoptado una ley que le impida poner la palabra “Patata” en el encabezado P3P.
    2. Tanto Google como Facebook pusieron un enlace en su campo de cabecera 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 no implementado legalmente aún se imponga a los desarrolladores dentro de IE. Si este encabezado no tiene ramificaciones legales, se debe ignorar este encabezado (o alternativamente, generar una advertencia o notificación en la consola). No se aplica! Ahora estoy 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 feliz a IE, agregue la siguiente línea a su código PHP (los demás idiomas deberían ser similares)

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

    Problema resuelto, y IE está contento con esta patata.

    Pude alejar el mal de ojo 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 volver a cargar su sitio o Explorer aún puede mostrar el mal de ojo, a pesar del hecho de que está funcionando bien. Esta es probablemente la razón principal por la que tuve tantos problemas para que funcione.

    Ningún archivo de política fue 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

    Esto está enterrado en los comentarios de otras respuestas, pero casi lo extraño, 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:

     CP="my compact p3p policy" 

    PERO, p3p está casi muerto como estándar en este momento y puede hacer que IE funcione sin invertir el tiempo y los recursos legales en la creación de una verdadera política de p3p. Esto se debe a que si el encabezado de política compacto de p3p no es válido, IE realmente lo 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, puede incluir un enlace a una página que explique por qué no tiene una política de 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 establece la cookie, por lo que es posible que no puedas hacer esto en tu PHP, asp.net, etc. código. Probablemente sea mejor configurarlo en el nivel del servidor web (es decir, en IIS o Apache).

    También tuve este problema, pensé en publicar el código que utilicé en mi proyecto MVC2. Tenga cuidado cuando en el ciclo de vida de la página que agrega en el encabezado o obtendrá una HttpException “El servidor no puede agregar 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).

     ///  /// Privacy Preferences Project (P3P) serve a compact policy (a "p3p" HTTP header) for all requests /// P3P provides a standard way for Web sites to communicate about their practices around the collection, /// use, and distribution of personal information. It's a machine-readable privacy policy that can be /// automatically fetched and viewed by users, and it can be tailored to fit your company's specific policies. ///  ///  /// More info http://www.oreillynet.com/lpt/a/1554 ///  public class P3PAttribute : ActionFilterAttribute { ///  /// On Action Executing add a compact policy "p3p" HTTP header ///  ///  public override void OnActionExecuting(ActionExecutingContext filterContext) { HttpContext.Current.Response.AddHeader("p3p","CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\""); base.OnActionExecuting(filterContext); } } 

    Ejemplo de uso:

     [P3P] public class HomeController : Controller { public ActionResult Index() { ViewData["Message"] = "Welcome!"; return View(); } public ActionResult About() { return View(); } } 

    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 lado (me disculpo si me lo perdí) fue que la línea P3P debe ser pasó el encabezado de TODOS los archivos enviados desde el servidor de terceros, incluso los archivos que no configuraron o usaron las cookies como archivos o imágenes de Javascript. De lo contrario, las cookies serán bloqueadas. Tengo más sobre esto en una publicación aquí: http://posheika.net/?p=110

    Cualquiera que tenga este problema en node.js.

    A continuación, agregue este módulo p3p y habilite este módulo en middleware.

     npm install p3p 

    Estoy usando Express así que lo agrego en app.js

    Primero requiere ese módulo en app.js

     var express = require('express'); var app = express(); var p3p = require('p3p'); 

    luego úselo como middleware

     app.use(p3p(p3p.recommended)); 

    Agregará encabezados p3p en el objeto res. No es necesario hacer más cosas.

    Obtendrás más información en:

    https://github.com/troygoode/node-p3p

    Si alguien está buscando la línea Apache; nosotros usamos este.

    El encabezado establece P3P “CP = \” Gracias IE8 \ “”

    Realmente no importó a qué le asignamos el valor de CP, siempre y cuando exista el encabezado P3P.

    Una posible cosa para hacer es agregar el dominio a los sitios permitidos en herramientas -> opciones de internet -> privacidad -> sitios: somedomain.com -> permitir -> OK.

    Esta publicación proporciona algunos comentarios sobre P3P y una solución abreviada que reduce los problemas con IE7 e IE8.

    Una solución que no he visto mencionar aquí, es el uso de almacenamiento de sesión en lugar de cookies. Por supuesto, esto puede no ajustarse a los requisitos de todos, pero en algunos casos es una solución fácil.

    Tengo un problema similar, también fui a investigar cómo generar la política de P3P esta mañana, aquí está mi post sobre cómo generar su propia política y uso en el sitio web 🙂 http://everydayopenslikeaflower.blogspot.com/2009/08/ how-to-create-p3p-policy-and-implement.html

    Implementé una política P3P completa antes, pero no quería pasar por la molestia de nuevo 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 hizo el truco para mí!

    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 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 (p. Ej., Internet frente a sitios de confianza).

    Por lo tanto, si su objective IFrame y su página html están en P3P de diferentes zonas, esto no ayudará con nada.

    También puede combinar los archivos p3p.xml y policy.xml como tales:

    /home/ubuntu/sites/shared/w3c/p3p.xml

        /                                    

    Encontré que la manera más fácil de agregar un encabezado es el proxy a través de Apache y usar mod_headers, como tal:

      ServerName mydomain.com DocumentRoot /home/ubuntu/sites/shared/w3c/ ProxyRequests off ProxyPass /w3c/ ! ProxyPass / http://127.0.0.1:8080/ ProxyPassReverse / http://127.0.0.1:8080/ ProxyPreserveHost on Header add p3p 'P3P:policyref="/w3c/p3p.xml", CP="NID DSP ALL COR"'  

    Por lo tanto, procesamos todas las solicitudes excepto las de /w3c/p3p.xml en nuestro servidor de aplicaciones.

    Puede probarlo todo con el validador W3C

    Si posee el dominio que necesita ser incrustado , entonces, antes de llamar a la página que incluye el IFrame, puede redireccionar a ese dominio, lo que creará la cookie y redirigirá hacia atrás, como se explica aquí: http: //www.mendoweb. ser / 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).

    Sé que es un poco tarde para poner mi contribución en este tema, pero perdí tantas horas que tal vez esta respuesta ayudará 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é fui incapaz de establecer la política P3P para resolver el problema …

    Durante mi búsqueda vi algo sobre cómo funcionaba la cookie en JSON. Ni siquiera lo bash porque pensé que si la cookie no pasaría por un iframe, no pasaría más por un array …

    Adivina qué, ¡sí! Entonces, si json_encode su cookie y luego decodifica después de su solicitud de ajax, ¡lo obtendrá!

    Tal vez haya algo que eché de menos y si lo hiciera, todas mis disculpas, pero nunca vi algo tan estúpido. Bloquee las cookies de terceros para garantizar la seguridad, ¿por qué no, pero déjela pasar si está codificada? ¿Dónde está la seguridad ahora?

    Espero que esta publicación ayude a alguien y otra vez, si me perdí algo y soy tonto, ¡por favor, enséñame!

    Esto finalmente funcionó para mí (después de mucho esfuerzo y generar algunas políticas usando 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

     /index.php /w3c/policy.html (Human readable format) /w3c/p3p.xml /w3c/policy.p3p 
    1. Index.php: solo envíe un encabezado adicional:
     header('P3P: policyref="/w3c/p3p.xml", CP="ALL DSP NID CURa ADMa DEVa HISa OTPa OUR NOR NAV DEM"'); 
    1. Contenido de p3p.xml
        /     
    1. Contenido de mi archivo policy.html
        Privacy Statement for YOUR COMPANY NAME   

    Privacy Policy

    About Us

    This is a privacy policy for YOUR COMPANY NAME. Our homepage on the Web is located at https://stackoverflow.com/questions/389456/cookie-blocked-not-saved-in-iframe-in-internet-explorer/YOURWEBSITE. The full text of our privacy policy is available on the Web at https://stackoverflow.com/questions/389456/cookie-blocked-not-saved-in-iframe-in-internet-explorer/ABSOLUTE URL OF THIS FILE This policy does not tell users where they can go to exercise their opt-in or opt-out options.

    We invite you to contact us if you have questions about this policy. You may contact us by mail at the following address:

    FIRSTNAME LASTNAME YOUR ADDRESS HERE 

    You may contact us by e-mail at info@YOURMAIL.eu. You may call us at TELEPHONENUMBER.

    Dispute Resolution and Privacy Seals

    We have the following privacy seals and/or dispute resolution mechanisms. If you think we have not followed our privacy policy in some way, they can help you resolve your concern.

    • Dispute: Contact us for further information

    Additional Information

    This policy is valid for 1 day from the time that it is loaded by a client.

    Data Collection

    P3P policies declare the data they collect in groups (also referred to as "statements"). This policy contains 1 data group.


    Group "App control data"

    We collect the following information:

    • HTTP cookies

    This data will be used for the following purposes:

    • Completion and support of the current activity.
    • Web site and system administration.
    • Research and development.
    • Historical preservation.
    • Other purposes

      Control Flow of the application

    This data will be used by ourselves and our agents.

    The data in this group has been marked as non-identifiable. This means that there is no reasonable way for the site to identify the individual person this data was collected from.

    The following explanation is provided for why this data is collected:

    This cookie data is only used to control the application within an iframe (eg a Facebook App)


    Cookies

    Cookies are a technology which can be used to provide you with tailored information from a Web site. A cookie is an element of data that a Web site can send to your browser, which may then store it on your system. You can set your browser to notify you when you receive a cookie, giving you the chance to decide whether to accept it.

    Our site makes use of cookies. Cookies are used for the following purposes:

    • Site administration
    • Completing the user's current activity
    • Research and development
    • Other (Control Flow of the application)


    Compact Policy Summary

    The compact policy which corresponds to this policy is:

     CP="ALL DSP NID CURa ADMa DEVa HISa OTPa OUR NOR NAV" 

    The following table explains the meaning of each field in the compact policy.

    Field Meaning
    CP= This is the compact policy header; it indicates that what follows is a P3P compact policy.
    ALL Access to all collected information is available.
    DSP The policy contains at least one dispute-resolution mechanism.
    NID The information collected is not personally identifiable.
    CURa The data is used for completion of the current activity.
    ADMa The data is used for site administration.
    DEVa The data is used for research and development.
    HISa The data is used for historical archival purposes.
    OTPa The data is used for other purposes.
    OUR The data is given to ourselves and our agents.
    NOR The data is not kept beyond the current transaction.
    NAV Navigation and clickstream data is collected.

    The compact policy is sent by the Web server along with the cookies it describes. For more information, see the P3P deployment guide at http://www.w3.org/TR/p3pdeployment.


    Policy Evaluation

    Microsoft Internet Explorer 6 will evaluate this policy's compact policy whenever it is used with a cookie. The actions IE will take depend on what privacy level the user has selected in their browser (Low, Medium, Medium High, or High; the default is Medium. In addition, IE will examine whether the cookie's policy is considered satisfactory or unsatisfactory, whether the cookie is a session cookie or a persistent cookie, and whether the cookie is used in a first-party or third-party context. This section will attempt to evaluate this policy's compact policy against Microsoft's stated behavior for IE6.

    Note: this evaluation is currently experimental and should not be considered a substitute for testing with a real Web browser.

    Satisfactory policy: this compact policy is considered satisfactory according to the rules defined by Internet Explorer 6. IE6 will accept cookies accompanied by this policy under the High, Medium High, Medium, Low, and Accept All Cookies settings.

    In Rails I am using this gem : https://github.com/merchii/rack-iframe Bawically it sets a set of abbreviations without a reference file: https://github.com/merchii/rack-iframe/blob/master/lib/rack/iframe.rb#L8

    It is easy to install when you dont care at all about the meaning of the p3p stuff.

    For anyone trying to get the P3P Compact Policy working with static content:

    It is only possible if you are able to send custom server-side response headers with the static content.

    For a more detailed explanation see my answer here: Set P3P code in HTML

    In Rails 3.2 I am using:

     class ApplicationController < ActionController::Base before_filter :set_p3p private # for IE session cookies thru iframe def set_p3p headers['P3P'] = 'CP="ALL DSP COR CURa ADMa DEVa OUR IND COM NAV"' end end 

    I got this from: http://dot-net-web-developer-bristol.blogspot.com/2012/04/setting-p3p-header-in-rails-session.html

    A better solution would be to make an Ajax call inside the iframe to the page that would get/set cookies…