IE 11 第一方会话 cookie 在 iframe 中丢失

Posted

技术标签:

【中文标题】IE 11 第一方会话 cookie 在 iframe 中丢失【英文标题】:IE 11 first-party session cookies being lost in iframe 【发布时间】:2014-08-14 14:36:25 【问题描述】:

我们有一个网站 (www.example.com),它将用户发送到一系列第三方页面以验证付款详细信息,我们在 iframe 中执行此操作。最初,来自 www.example.com 的本地页面被加载到 iframe 中,并且用户被重定向到第三方 URL。用户完成第三方步骤后,它们会被 302 重定向回 iframe 内我们网站 (www.example.com) 上的页面。

这适用于我们测试过的所有浏览器,除了 IE 11,我们的 cookie 似乎丢失了。我们在 Windows 7 和 8.1 下,在桌面和“Metro”模式下都检查了这一点,问题存在于所有版本中。

当用户浏览我们的网站时,我们会设置一个会话 cookie,该 cookie 会正确发送到最初加载到 iframe 中的第一方页面。但是,一旦用户浏览了此 iframe 中的某些第三方页面,会话 cookie 就不会随下一个请求一起发送。

如果我们将 IE 11 的隐私设置设置为最低值,此问题就会消失,并且一切正常。

到目前为止,我发现的所有潜在解决方案都与 P3P 标头有关。我们设置了有效且正确的 P3P 标头和 XML 策略文件,并且此问题仅在 IE 11 中出现。


更新:我们使用 JS 设置了一些其他 cookie。这些都按预期持续存在。区别在于到期日期(JS cookie 为 1 年,会话 cookie 为 1 个月)、域(JS cookie 显式为“example.com”,会话 cookie 为空)以及它们是否为“仅 HTTP”(JS 为 false cookie,会话 cookie 为真)。

我已尝试根据会话 cookie 的 JS cookie 设置所有这些选项,但没有任何区别。


更新 2: 经过更多测试后,我无法创建重现此问题的测试用例。然而,我尝试在实时代码中测试的任何其他 cookie 似乎也被破坏了,即使它们设置的代码与有效的 JS cookie 完全相同。简而言之;我还没有找到任何 cookie 的模式,哪些有效,哪些无效。

需要注意的一个可能有趣的事情是 cookie 没有被删除,它们只是没有被发送到最终请求。如果加载了另一个页面,cookie 会神奇地重新出现并被发送;这让我相信这是一个围绕 iframe 和 P3P 的错误。


更新 3(第 3 天): IE 11 对 cookie 的处理继续让我感到困惑。我越深入微软的迷宫,我就越迷失在它不断变化的墙壁中。而且这里有鬼。半梦半醒的安全政策碎片,它们交织成某种空灵的生物,它一举一动都在跟踪和嘲弄我。起初,我被冰冻、恐惧、惊恐地看着这个难以捉摸的身影突然消失在视线之外,但随着时间的流逝,我从知道它的接近度中获得了更多的安慰。难道这就是我被派到这里来对抗的野兽?在这种时候,我怎么可能杀死我唯一的同伴?

【问题讨论】:

您能显示您正在使用的 P3P 标头吗? P3P: CP="ALL DSP COR CUR ADM PSA CONi OUR SAM OTR UNR LEG" 如果没有此标头,则 iframe 中没有任何 cookie,正如预期的那样。有了它,一些 cookie 正在工作,但有些看似随机的却没有。我无法找到一种模式或任何与那些不起作用的模式不同的地方。 试试***.com/a/13975828/307976 好诗莎士比亚! 看到这个:***.com/a/16475093/457850 - 我花了几个小时试图让 P3P 和 cookie 在 iframe 中很好地播放。放置一个无效的 P3P 标头,例如 we do not have P3P,它可以正常工作。 【参考方案1】:

我们在 Internet Explorer 11 中遇到了类似的问题,在通过 https 重定向后会话 cookie 丢失。

请求链看起来像这样:

对 / 的初始请求 -> 会话 cookie 集 -> 重定向到外部 URL -> 重定向回来(会话cookie丢失)

我们的问题是由于RFC952 的主机名无效,我们的测试服务器 URL 中有下划线。如果 URL 不符合 RFC952,Internet Explorer 似乎会在通过 https 重定向时静默丢弃会话 cookie。当使用破折号而不是下划线时,一切都按预期工作。

原始解决方案可在此asp.net blogpost from 2004. 的Update 2 部分找到相关的microsoft bug 票here.

希望这会对某人有所帮助。

【讨论】:

有趣的是,我在 2008 年发现了这个问题——由于这个原因,域名中不允许使用下划线。 我确实遇到了这个问题,并且发现它也是“由于”在主机名中加下划线。编辑后的 ​​hosts 文件解决了这个问题(不是生产环境,所以没什么大不了的)。谢谢!【参考方案2】:

我注意到,当为新页面启用 IE7 兼容模式时,会话 cookie 经常丢失。我想这同样适用于 iframe。 iframe 发送的 X-UA-Compatible 标头值是否与父页面不同,或者与会话中的早期不同?就像您的会话以 IE=edge 开始,而 iframe 页面将其设置为 IE=7。如果是这样,IE 似乎经常为兼容模式页面和会话 cookie 启动一个新的 IE PID(但它似乎没有被传输。

【讨论】:

【参考方案3】:

我有这个主题中提到的相同问题。

我们的网站放置在 iframe 中并使用会话到 cookie(asp.net_session)。在站点中导航时没有问题(cookie 正在工作并附加到请求标头)。但是当我们将客户重定向到另一个网站(othersite.com)然后 othersite.com 将客户重定向到我们的域并强制它以“_top”打开时,浏览器不会发送带有请求的 cookie,因此我们失去了客户会话。这个问题只出现在 IE 上。

你有什么建议来解决这个问题。

【讨论】:

不幸的是我从来没有找到解决这个问题的方法,而且我知道继承它的开发人员在一年左右后遇到了这个问题。检查您的 P3P 标头,祝您好运!【参考方案4】:

在 IE11 中检查您的 Internet 选项。 工具 > Internet 选项 > 隐私 > 高级

也许您应该覆盖它并启用“始终允许会话 cookie”。

【讨论】:

以上是关于IE 11 第一方会话 cookie 在 iframe 中丢失的主要内容,如果未能解决你的问题,请参考以下文章

反向代理背后的WordPress:未在Safari和IE中设置会话cookie

为啥我在 IE 9 中丢失了有关 Ajax 请求的 cookie 和会话

Django之cookie与session

会话技术--cookie

会话技术--cookie

Cookie和Session