如何在Safari中的iframe中设置外部域的cookie?

时间:2008-10-05 16:28:53

标签: cookies iframe safari

来自Apple developer faq

  Safari拥有保守派   限制cookie的cookie策略   仅写入所选页面   (“导航到”)用户。

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

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

如果无法访问其他网站上的代码,我怎样才能使用户体验尽可能不引人注目呢?

是否有(javascript?)方式检查其他网站的Cookie 已设置,因此,如果需要,首先显示与其他网站的直接链接?

更新

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

非常好的Postmessage-plugin,由daepark,我开始工作。
另一个jQuery postMessage,我发现Ben Alman,但没有经过测试。

5 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:8)

这是一个称为同源政策的问题。从本质上讲,它是一种防范创建安全漏洞的安全措施。

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

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

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

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

查看这篇关于iframe通讯的帖子,这很有道理! Stackoverflow post

这些链接也非常有用!

1) Secure Cross-Domain Communication in the Browser
2) wiki SOP or Same Origin Policy

祝你好运!

答案 2 :(得分:3)

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

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

当然,这不是最好的代码,但很可能解决你的问题。

答案 3 :(得分:2)

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

答案 4 :(得分:2)

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