22

来自 Apple开发人员常见问题解答

Safari 附带了一个保守的 cookie 策略,该策略将 cookie 写入仅限于用户选择(“导航到”)的页面。

默认情况下,Safari 仅允许来自您直接导航到的站点的 cookie。(即,如果您单击带有该域名 url 的链接)。

这意味着,如果您使用 iFrame 从您自己的站点加载一个页面,该页面来自另一个站点的页面,则另一个站点无法设置 cookie。(例如,售票处)。一旦您直接访问了其他域,其他站点就能够访问和更改其自己的 cookie。

如果无法访问其他站点上的代码,我如何才能使用户体验尽可能不显眼?

是否有(javascript?)方法来检查是否已设置其他站点的 cookie,并相应地,如果需要,首先显示指向其他站点的直接链接?

更新:

HTML5 功能“window.postmessage”似乎是一个不错的解决方案。
有一些 jQuery 库可能会有所帮助,并且与最新的浏览器兼容。
本质上,iFrame 文档使用 Json 通过 window 元素发送消息。

非常好的Postmessage-plugin,由 daepark 提供,我开始工作了。
和另一个jQuery postMessage,我发现了 Ben Alman,但尚未测试。

4

5 回答 5

10

safari 和所有现代浏览器都支持 localStorage,即使在加载到 iframe 中的页面上也允许读/写操作。如果您不介意放弃对 ie6 和 ie7 的支持,请尝试在框架站点中使用 localStorage 而不是 cookie。我知道您的问题明确表示您无法访问框架站点上的代码,但对于那些这样做的人来说,localStorage 绝对解决了“safari iframe 中没有 cookie”的问题。

于 2012-03-05T02:07:31.870 回答
8

这是一个称为同源策略的问题。从本质上讲,它是一种防止制造安全漏洞的安全措施。

当您的 iframe 指向您自己域中的页面时,JavaScript 可以访问您所在的页面和 iframe 中的页面。这是可接受的父母对孩子和孩子对父母的关系。

 (parent doc)        (iframe doc)
    HTML --> IFRAME <-- HTML 
      ^--------|---------^

但是,一旦您有一个指向外部页面的文件,SOP 就会发挥作用,并拖曳在父页面和 iframe 页面之间传递的任何信息。

 (parent doc)        (iframe doc)
    HTML --> IFRAME <-- HTML 
               X

查看这篇关于 iframe 通信的帖子,这很有意义! Stackoverflow 帖子

这些链接也真的很有帮助!

1) 浏览器中的安全跨域通信
2) wiki SOP 或同源策略

祝你好运!

于 2009-06-23T14:00:41.343 回答
3

此页面建议您在页面中放置一些 javascript,以检测是否缺少始终存在的 cookie。当它发现 cookie 尚未设置时,它会将所需的会话数据发布到设置 cookie 的页面,并将您重定向回原始页面。

显然 POST 足以满足 Safari 的“我是否导航到此域”测试,因此从那时起它接受来自该域的 cookie。

当然,这不是最好的代码,但可以很好地解决您的问题。

于 2009-08-12T16:18:48.453 回答
2

这是 Safari 中显示的 Facebook 应用程序的常见问题。许多人(包括我自己)处理这个问题的方式是让 iframed 页面 POST 到自己。当页面发布了表单数据时,就可以设置 cookie。最后,它适用于 1 页面刷新,甚至可以是您的用户登录 POST。

于 2010-10-23T01:09:17.723 回答
2

一种解决方案(有点混乱)可能是让父页面检查 cookie 的存在,如果 cookie 不存在,则对 iframe 页面域上设置 cookie 的脚本运行 AJAX 调用。

于 2009-08-17T13:58:23.973 回答