Cookie阻止/未保存在Internet Explorer的IFRAME中
我有两个网站,假设他们是example.com
和anotherexample.net
。 在anotherexample.net/page.html
,我有一个IFRAME SRC="http://example.com/someform.asp"
。 该IFRAME显示一个表格供用户填写并提交至http://example.com/process.asp
。 当我在自己的浏览器窗口中打开表单(“ someform.asp
”)时,一切正常。 但是, 当我在IE 6或IE 7中以IFRAME的形式加载someform.asp
时,不会保存example.com的cookie。 在Firefox中,这个问题不会出现。
出于测试目的,我在http://newmoon.wz.cz/test/page.php上创建了一个类似的设置。
example.com
使用基于cookie的会话(并且我无能为力),因此如果没有cookie, process.asp
将无法执行。 我如何强制IE保存这些cookie?
嗅探HTTP流量的结果:在GET /someform.asp响应中,每个会话都有一个有效的Set-Cookie头(例如Set-Cookie: ASPKSJIUIUGF=JKHJUHVGFYTTYFY
),但在POST /process.asp请求上,没有Cookie头在所有。
编辑3:一些AJAX +服务器端脚本显然能够避开这个问题,但这看起来非常像一个bug,再加上它会打开一整套新的安全漏洞。 我不希望我的应用程序使用错误+安全漏洞的组合,只是因为它很容易。
编辑: P3P政策是根本原因 ,下面有完整的解释。
我得到它的工作,但解决方案有点复杂,所以请忍受我。
发生了什么
实际上,Internet Explorer对IFRAME页面的信任程度较低(IE称为“第三方”内容)。 如果IFRAME内的页面没有隐私政策,则其Cookie被阻止(状态栏中的眼睛图标表示它,当您点击它时,它会显示一个阻止的URL列表)。
邪恶之眼http://stuff.piskvor.org/cookies_blocked_MSIE_eye.png
在这种情况下,当cookie被阻塞时,会话标识符不会被发送,并且目标脚本会引发'未找到会话'错误。
(我已经尝试将会话标识符设置为表单并从POST变量中加载它, 这可能会起作用 ,但出于政治原因,我无法做到这一点。)
可以使IFRAME 内部的页面更加可信: 如果内部页面发送带有IE可接受的隐私策略的P3P头部,则Cookie将被接受 。
如何解决它
创建一个p3p策略
一个好的起点是W3C教程。 我已经完成了它,下载了IBM隐私策略编辑器,并且在那里我创建了一个隐私策略的表示,并给它一个名称以引用它(这里是policy1
)。
注意 :在这一点上,您实际上需要确定您的网站是否有隐私政策,如果没有,请创建它 - 无论是收集用户数据,数据类型,使用情况,访问权限,等等。你需要找到这些信息并思考它。 只需将几个标签打在一起就不会削减标签。 这一步不能纯粹用软件来完成,而且可能是高度政治性的(例如,“我们应该出售点击统计数据吗?”)。
(例如“该网站由ACME有限公司运营,它使用匿名的每会话标识符进行操作,仅在明确允许的情况下收集用户数据,并且仅用于以下用途,数据仅在必要时存储,只有我们的公司可以访问它等等“)。
(使用此工具进行编辑时,可以查看策略中的错误/遗漏,“HTML策略”选项卡也非常有用:在底部,它具有“策略评估” - 快速检查策略是否会被阻止通过IE的默认设置)
编辑器将导出到.p3p文件,该文件是上述策略的XML表示形式。 此外,它可以导出此政策的“紧凑版本”。
链接到政策
然后需要一个策略引用文件( http://example.com/w3c/p3p.xml
)(网站使用的隐私策略索引):
<META>
<POLICY-REFERENCES>
<POLICY-REF about="/w3c/example-com.p3p#policy1">
<INCLUDE>/</INCLUDE>
<COOKIE-INCLUDE/>
</POLICY-REF>
</POLICY-REFERENCES>
</META>
<INCLUDE>
显示将使用此策略的所有URI(在本例中为整个站点)。 我从编辑器导出的策略文件已上传到http://example.com/w3c/example-com.p3p
发送包含响应的紧凑标题
我已经在example.com上设置了webserver来发送带有响应的紧凑标题,如下所示:
HTTP/1.1 200 OK
P3P: policyref="/w3c/p3p.xml", CP="IDC DSP COR IVAi IVDi OUR TST"
// ... other headers and content
policyref
是策略引用文件的相对URI(反过来引用隐私策略), CP
是紧凑策略表示。 请注意,示例中的P3P标头组合可能不适用于您的特定网站; 您的P3P标题必须真实地代表您自己的隐私政策!
利润!
在这种配置下,邪恶之眼不会出现,cookie即使在IFRAME中也会保存,并且应用程序可以正常工作。
编辑:除非你喜欢从法律诉讼中捍卫,否则不要做
有几个人建议“只需将一些标签放入P3P标头,直到邪恶之眼放弃”。
标签不仅仅是一堆,它们具有真实的世界意义 ,它们的使用赋予您真正的世界责任 !
例如,假装你从不收集用户数据可能会使浏览器感到高兴,但如果你实际收集用户数据,P3P就会与现实相冲突。 简单而简单, 你有意向用户说谎 ,这在某些国家可能是犯罪行为。 如在“入狱,不要收200美元”。
一些例子(见全套标签的p3pwriter):
STP
但没有保留策略,那么您可能会犯下欺诈行为,这是多么酷?完全没有。) 我不是律师,但我不愿意去法院看看P3P标题是否真的具有法律约束力,或者您是否可以向您的用户承诺任何内容而不真正兑现承诺。
我花了很大一部分时间来研究这个P3P的事情,我觉得有必要分享我发现的东西。
我注意到P3P概念非常过时,似乎只能被Internet Explorer(IE)真正使用/强制执行。
最简单的解释是:如果您使用的是cookie,IE希望您定义一个P3P标头。
这是一个不错的主意,幸运的是,大多数时候不提供这个头文件不会导致任何问题(读取浏览器警告)。 除非您的网站/网络应用程序使用(i)框架加载到其他网站。 这是IE在***中变成巨大痛苦的地方。 除非设置了P3P标头,否则它将不允许您设置Cookie。
知道这一点,我想找到以下两个问题的答案:
我的发现是:
这个概念诞生于2002年,让我感到困惑的是,这种过时的,合法的未实现的概念仍然被IE中的开发者强加于人。 如果这个头文件没有任何合法的分支,这个头文件应该被忽略(或者,在控制台中生成一个警告或通知)。 没有强制执行! 我现在不得不在我的代码中插入一行(并向客户端发送一个头文件),它绝对没有任何问题。
简而言之 - 保持IE快乐 - 将以下行添加到您的PHP代码中(其他语言应该看起来类似)
header('P3P: CP="Potato"');
问题解决了,IE对这个马铃薯很满意。
我能够通过简单地将这个小标题添加到IFrame(PHP解决方案)中的站点来让邪恶的眼睛消失:
header('P3P: CP="NOI ADM DEV COM NAV OUR STP"');
请记住按Ctrl + F5重新加载您的网站或资源管理器可能仍然显示邪恶的眼睛,尽管事实证明它的工作正常。 这可能是我为什么有这么多问题得到它工作的主要原因。
根本没有任何政策文件是必要的。
编辑:我发现了一个很好的博客条目,解释了IFrame中cookie的问题。 它还可以快速修复C#代码:框架,ASPX页面和拒绝Cookies
链接地址: http://www.djcxy.com/p/28065.html上一篇: Cookie blocked/not saved in IFRAME in Internet Explorer