即使使用 P3P 标头,也无法在 IE 的 IFRAME 中设置 cookie

Posted

技术标签:

【中文标题】即使使用 P3P 标头,也无法在 IE 的 IFRAME 中设置 cookie【英文标题】:Cannot set cookies in IFRAME in IE, even with P3P header 【发布时间】:2011-08-29 05:56:27 【问题描述】:

我在这里看到了很多关于如何让 cookie 在 IE 中的 iframe 中工作的帖子,并且我尝试了几种解决方案,但到目前为止都没有运气。这是我正在处理的问题:

我有一个通过 javascript 在客户网站上创建的 iframe(一个小部件)。我无法控制客户的网站。我需要设置 cookie 以使用户在 iframe 中保持登录状态,它适用于 Chrome 和 Firefox,但不适用于 IE 7/8。我没有测试过 IE 6,但我认为它也有同样的问题。

我使用 IBM 的策略编辑器创建了一个 P3P 策略,编辑器说紧凑策略在 IE 的安全性下是可以接受的,无论它设置为低、中还是高。我使用的CP是:

P3P: policyref="/w3c/p3p.xml" CP="CAO DSP COR CURa ADMa DEVa PSAa PSDa CONi TELi OUR IND PHY ONL UNI COM NAV INT DEM CNT PRE"(我尝试了其他几个人们认为有效的 CP,但结果没有任何差异。)

网络服务器 (nginx) 正在使用 每个 文件提供此 P3P 标头。我不是从代码中提供它。

p3p.xml 文件存在且与压缩策略匹配。 p3p.xml 使用 W3C P3P 验证器进行验证。

即使使用 P3P 标头(无论我尝试了哪一个),IE 都会在底部的状态栏中给我“邪恶的眼睛”,并且不会让我设置 cookie。它们在隐私报告中显示为已阻止。

我阅读了 Piskvor 关于这个主题的 SO 帖子:Cookie blocked/not saved in IFRAME in Internet Explorer,但我无法重现他在演示网站上所做的事情:http://newmoon.wz.cz/test/page.php?send_p3p=1。我认为这是因为我得到了邪恶的眼睛而他没有。我已经完成了我所读到的一切作为摆脱邪恶的建议,但它仍然存在。嘲笑我。

如果你想试试我的测试页面:http://truelike.com/js/bobs/frametest.php设置/读取页面在 iframe 外部查看时工作正常,但在使用 IE 时根本无法在内部工作。

作为参考,我在后端使用 PHP。

任何帮助都将不胜感激 - 我们在这里变得绝望。

谢谢!

【问题讨论】:

【参考方案1】:

nginx 0.8.20 的变化 错误修正:“Set-Cookie”和“P3P”FastCGI 响应标题行是 如果没有“fastcgi_hide_header”指令,则在缓存时不隐藏 与任何参数一起使用。

Nginx Changes log

【讨论】:

【参考方案2】:

所以,我自己解决了这个问题。看起来问题出在 NGINX 的 HTTPUserIDModule (http://wiki.nginx.org/HttpUserIdModule) 上。我一直在使用它来发送 P3P 标头,但是 nginx 没有一致地发送标头,可能是由于他们文档中的这一行:

指令为标题分配值 P3P,将与发送 饼干。

我在使用 curl 或 lynx 检查时看到了标头,但在使用 Firebug 或 Charles 检查时却没有。也许有一个配置选项可以解决这个问题,但我找不到它。

无论如何,如果您将标头指令拉出 HTTPUserIdModule 并在代码中手动发送标头,它就可以工作。如果您使用 HTTPHeadersModule http://wiki.nginx.org/HttpHeadersModule 手动发送标头,它可能会起作用,但我尚未对此进行测试。

一旦它通过代码工作,我发现我不需要所有文件的标题 - 仅在文件设置/获取 cookie 上使用它就足够了,这与我看到的许多建议相反。

此外,我的 CP 显然过于咄咄逼人,尽管 IBM 的政策编辑说没关系。我使用了一个更基本的 CP,并且效果很好。

【讨论】:

您是仅使用紧凑策略还是同时使用 p3p.xml 文件?你能说一下你在哪个网站上使用了这个政策吗?对于具有中等安全性和 p3p 策略的 IE8,我已经有一段时间了。 我只使用了compact策略,具体来说:header('P3P: CP="CAO PSA OUR"'); 我会试试的。用户登录需要使用cookies吗? 是的,除此之外,我愿意。

以上是关于即使使用 P3P 标头,也无法在 IE 的 IFRAME 中设置 cookie的主要内容,如果未能解决你的问题,请参考以下文章

GAE 上的 p3p 标头(Google App Engine)

IE 11 跨域请求

IE CORS - 即使指定了标头,访问控制允许标头错误

IE、P3P、IFrame 和阻止的 cookie(在页面主机页面请求个人信息之前有效)

即使放入标头c ++也无法内联函数

即使设置了标头,也无法验证 CSRF 令牌的真实性 Rails 4 Ajax