Cookie bloqueada/no guardada en IFRAME en Internet Explorer




internet-explorer cookies (15)

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 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 carga someform.asp como un IFRAME en IE 6 o IE 7, las cookies de example.com no se guardan. En Firefox este problema no aparece.

Para propósitos 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), así que sin las cookies, process.asp no se ejecutará. ¿Cómo fuerzo a IE a guardar esas cookies?

Resultados de la detección del 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 a petición POST /process.asp, no hay un encabezado de Cookie en absoluto.

Edit3: algunos scripts AJAX + en el servidor son aparentemente capaces de eludir el problema, pero 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.

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


Para cualquiera que intente que la Política Compacta P3P trabaje con contenido estático:

Es solamente posible si usted es capaz de enviar las cabeceras de respuesta de servidor personalizados con el contenido estático.

Para una explicación más detallada, vea mi respuesta aquí: Establecer código P3P en HTML


Cualquiera que tenga este problema en node.js.

Luego agregue este módulo p3p y habilite este módulo en el 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');

entonces utilízalo como middleware

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

Agregará encabezados p3p en el objeto res. No hay necesidad de hacer nada extra.

Obtendrá más información en:

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


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 (pido disculpas 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 utilizan las cookies, como archivos o imágenes de Javascript. De lo contrario se bloquearán las cookies. Tengo más información sobre esto en una publicación aquí: http://posheika.net/?p=110


Esto está enterrado en los comentarios de otras respuestas, pero casi lo pierdo, así que parece que merece su propia respuesta.

Para revisar: para que IE acepte cookies de terceros, necesita servir 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 punto y puede hacer que IE funcione sin necesidad de invertir tiempo y recursos legales para crear 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 realmente lo considera como una buena política y acepta cookies de terceros. Así que 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 p3p, como hacen Google y Facebook (apuntan 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 simplemente en su PHP, asp.net, etc. código. Probablemente sea mejor configurarlo en el nivel del servidor web (es decir, en IIS o Apache).


He implementado una política P3P completa anteriormente, pero no quería volver a pasar por la molestia de 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 OUR":

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í!


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

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á establecer una cookie a menos que se establezca el encabezado P3P.

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

  1. ¿A quien le importa? En otras palabras, ¿puedo ser demandado si pongo la palabra "Papa" 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 tiene algún peso legal. Durante mi investigación no encontré un solo país en todo el mundo que haya adoptado una ley que le impida poner la palabra "Papa" en el encabezado de P3P
  2. Tanto Google como Facebook colocan un enlace en el campo del encabezado P3P que se refiere 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 sea obligatorio para los desarrolladores dentro de IE. Si este encabezado no tiene ninguna ramificación legal, este encabezado debe ignorarse (o, alternativamente, generar una advertencia o notificación en la consola). No impuesta! 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 parecer similares)

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

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


Pude hacer desaparecer 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 de que está funcionando bien. Esta es probablemente la razón principal por la que tuve tantos problemas para que funcionara.

Ningún archivo de política fue necesario en absoluto.

Edición: encontré una entrada de blog agradable 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


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.

Estaba intentando llamar a una cookie de terceros en mi sitio y, por supuesto, no funcionaba en Internet Explorer 10, incluso en un nivel de seguridad bajo ... no me preguntes 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 de P3P para resolver el problema ...

Durante mi búsqueda vi algo sobre cómo hacer funcionar la cookie en JSON. Ni siquiera lo intento porque pensé que si la cookie no pasa a través de un iframe, no pasará más a través de una matriz ...

Adivina qué, lo hace! Por lo tanto, si inicia la codificación de su cookie y luego la descodifica después de su solicitud de ajax, ¡la obtendrá!

Tal vez haya 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éjelas pasar si están codificadas? ¿Dónde está la seguridad ahora?

Espero que esta publicación ayude a alguien y otra vez, si me perdí algo y soy tonta, ¡por favor educame!


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

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

<META xmlns="http://www.w3.org/2002/01/P3Pv1">
  <POLICY-REFERENCES>
    <POLICY-REF about="#policy1">
      <INCLUDE>/</INCLUDE>
      <COOKIE-INCLUDE/>
    </POLICY-REF>
  </POLICY-REFERENCES>
  <POLICIES>
    <POLICY discuri="" name="policy1">
      <ENTITY>
        <DATA-GROUP>
          <DATA ref="#business.name"></DATA> 
          <DATA ref="#business.contact-info.online.email"></DATA> 
        </DATA-GROUP>
      </ENTITY>
      <ACCESS>
        <nonident/>
      </ACCESS>
      <!-- if the site has a dispute resolution procedure that it follows, a DISPUTES-GROUP should be included here -->
      <STATEMENT>
        <PURPOSE>
          <current/>
          <admin/>
          <develop/>
        </PURPOSE>
        <RECIPIENT>
          <ours/>
        </RECIPIENT>
        <RETENTION>
          <indefinitely/>
        </RETENTION>
        <DATA-GROUP>
          <DATA ref="#dynamic.clickstream"/>
          <DATA ref="#dynamic.http"/>
        </DATA-GROUP>
      </STATEMENT>
    </POLICY>
  </POLICIES>
</META>

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:

<VirtualHost *:80>
  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"'
</VirtualHost>

Por lo tanto, hacemos un proxy de todas las solicitudes excepto las de /w3c/p3p.xml a nuestro servidor de aplicaciones.

Puedes probarlo todo con el validador W3C


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 en el encabezado o obtendrá una HttpException "El servidor no puede agregar el encabezado después de que se hayan enviado los encabezados HTTP ". Utilicé un ActionFilterAttribute personalizado en el método OnActionExecuting (llamado antes de que se ejecute la acción).

/// <summary>
/// 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.
/// </summary>
/// <remarks>
/// More info http://www.oreillynet.com/lpt/a/1554
/// </remarks>
public class P3PAttribute : ActionFilterAttribute
{
    /// <summary>
    /// On Action Executing add a compact policy "p3p" HTTP header
    /// </summary>
    /// <param name="filterContext"></param>
    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();
    }
}

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


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


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 la redirigirá nuevamente, 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).









p3p