我有两个网站,比如说example.com和anotherexample.net。 在anotherexample.net/page.html上,我有一个IFRAME SRC=“http://example.com/someform.asp”。IFRAME显示一个表单供用户填写并提交到http://example.com/process.asp。当我在它自己的浏览器窗口中打开表单(“someform.asp”)时,一切正常。 然而,当我在ie6或ie7中加载someform.asp作为IFRAME时,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报头。

Edit3:一些AJAX+服务器端脚本显然能够避开这个问题,但这看起来非常像一个bug,而且它还打开了一组全新的安全漏洞。我不希望我的应用程序使用漏洞+安全漏洞的组合只是因为它很容易。

编辑:P3P政策是根本原因,详细解释如下。


当前回答

我以前已经实现了一个完整的P3P策略,但我不想再为我正在工作的新项目经历一次麻烦。我发现这个链接对于解决问题的简单解决方案很有用,只需要指定一个最小的紧凑P3P策略“CAO PSA OUR”:

http://blog.sweetxml.org/2007/10/minimal-p3p-compact-policy-suggestion.html

这篇文章引用了一个指向Microsoft kb文章的链接(现在已失效)。政策对我起作用了!

其他回答

我可以通过简单地在IFrame (PHP解决方案)中添加这个小标题来消除邪恶的眼睛:

header('P3P: CP="NOI ADM DEV COM NAV OUR STP"');

记住按ctrl+F5重新加载你的网站,否则资源管理器可能仍然会显示邪恶之眼,尽管它工作正常。这可能是为什么我有这么多问题让它工作的主要原因。

根本不需要策略文件。

编辑: 我发现了一篇很好的博客文章,解释了IFrames中cookie的问题。它在c#代码中也有一个快速修复: 框架,ASPX页面和拒绝的cookie

我花了一天的大部分时间研究P3P的事情,我觉得有必要分享我的发现。

我注意到P3P概念已经非常过时了,似乎只有IE (Internet Explorer)才真正使用/实施。

最简单的解释是:IE希望您在使用cookie时定义P3P报头。

这是一个很好的想法,幸运的是,大多数时候不提供这个报头不会引起任何问题(请阅读浏览器警告)。除非您的网站/web应用程序是使用(i)框架加载到其他网站。这就是IE成为***的巨大痛苦之处。除非设置了P3P报头,否则它将不允许您设置cookie。

了解到这一点,我想找到以下两个问题的答案:

谁在乎呢?换句话说,如果我把“土豆”这个词放在标题中,我会被起诉吗? 其他公司怎么做?

我的发现是:

没人在乎。我找不到任何一份文件表明这项技术有任何法律效力。在我的研究中,我没有发现世界上任何一个国家通过法律禁止在P3P标题中使用“Potato”这个词 谷歌和Facebook都在他们的P3P报头字段中放了一个链接,指向一个页面,描述为什么他们没有P3P报头。

这个概念诞生于2002年,让我困惑的是,这个过时的、法律上未实现的概念仍然被强加在IE的开发人员身上。 如果此报头没有任何法律后果,则应忽略此报头(或者在控制台中生成警告或通知)。不执行!我现在被迫在我的代码中放入一行(并向客户端发送一个报头),它完全不做任何事情。

简而言之,为了让IE满意,在PHP代码中添加以下代码行(其他语言应该看起来类似)

header('P3P: CP="Potato"');

问题解决了,IE对这个土豆很满意。

如果有人在寻找阿帕奇线;我们用了这个。

头集P3P "CP=\"谢谢IE8\""

只要有P3P报头,我们将CP值设置为什么并不重要。

一种可能的做法是将域添加到工具-> internet选项-> privacy -> sites: somedomain.com -> allow -> OK。

更好的解决方案是在iframe中对页面进行Ajax调用,以获取/设置cookie…