关于IE浏览器下iframe内嵌页面无法正确获取cookie的问题

2017-01-16 21:40:30

今天遇到一个十分怪异的问题:站点www.parent.com的页面中通过iframe包含了站点www.son.com的页面,测试中发现当使用firefox/chrome浏览站点www.son.com的页面均正常显示,而换用IE后便出现错误。

一开始我怀疑IEiframe中的src属性有所限制,比如:不接受服务器端header重定向,因为我在www.son.com的页面中使用了header重定向功能,但跟踪的结果是所有的URL参数都正常;继而又开始trace程序,最终确定在出错前的一步所有的输入、输出均正确无误;无奈之下只好打印不同浏览器下的cookie,看看他们是否存在差异,殊不知这一trace大吃一惊:IE浏览器下www.son.com页面无法正确的获取其设置cookie?!

google之,然后发现了这个说明:http://www.microsoft.com/windowsxp/downloads/updates/sp2/docs/privacy_ie.mspx

读罢才知道在IE6+或者windows SP2+系统中,微软添加了P3P隐私保护协议的支持,并且默认阻止第三方无隐私安全声明cookie

在我的应用中,站点www.parent.com即是第一方,而它通过iframe包含的站点www.son.com便成了第三方。在页面浏览过程中,位于站点www.son.com的程式往浏览器设置cookie总是会成功(PS:当然,浏览器自身的cookie限制未生效),但默认情况下IE的隐私保护会禁止发送属于www.son.comcookie,包括sessioncookie

由于这个问题在IE中表现很特殊,只是在状态栏中显示一个带有红色禁止标志的小眼睛,所以一般不易被察觉(PS:我就是因此而浪费了一个下午~~~)。

双击这个图标就可以打开浏览器当前已保护的隐私项,如下:

如上图所示,属于某站点的cookie已经被浏览器阻挡。所以即便是站点确认已正确的设置了cookie,但它依然无法在后续请求中获取先前设置的cookie值。

目前解决的办法有两种:

一是修改浏览器隐私设置,将隐私设为最低;

你当然不会采用这种方式吧?难道你想要站点的所有用户都能遵从你的命令?

另外一中方法相对环保许多,既是通过W3C标准的P3P头声明cookie的安全隐私,这样一来IE浏览器就能按照你声明的隐私范围处理了。

常见的做法是发送如下的header头:P3P: CP=CAOPSA OUR,在PHP中你可以这样做:header('P3P: CP=CAO PSA OUR');

发表评论:

Powered by PHP 学习者(mail:517730729@qq.com)

原百度博客:http://hi.baidu.com/ssfnadn

备案号:闽ICP备17000564号-1

开源中国 PHPCHINA