我有两个网站,比如说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政策是根本原因,详细解释如下。


当前回答

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

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

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

根本不需要策略文件。

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

其他回答

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

我让它工作了,但解决方案有点复杂,所以请耐心等待。

发生了什么

实际上,Internet Explorer对IFRAME页面的信任程度较低(IE称其为“第三方”内容)。如果IFRAME内的页面没有隐私政策,则其cookie将被阻止(状态栏中的眼睛图标表示,当您单击它时,它将显示被阻止的url列表)。

(来源:piskvor.org)

在这种情况下,当cookie被阻塞时,会话标识符不会发送,目标脚本抛出'session not found'错误。

(我已经尝试将会话标识符设置到表单中,并从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(在我的示例中是整个站点)。我从Editor导出的策略文件上传到http://example.com/w3c/example-com.p3p

发送带有响应的压缩头

我已经在example.com设置了web服务器来发送带有响应的压缩头,就像这样:

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头必须如实代表您自己的隐私政策!

利润!

在此配置中,Evil Eye不会出现,cookie甚至保存在IFRAME中,应用程序可以正常工作。

编辑:不要做什么,除非你喜欢从诉讼中辩护

一些人建议“在你的P3P头中加入一些标签,直到邪恶之眼放弃”。

标签不仅仅是一堆比特,它们具有现实世界的含义,它们的使用赋予您现实世界的责任!

例如,假装您从未收集用户数据可能会让浏览器高兴,但如果您实际收集用户数据,P3P就与现实相冲突。简单地说,你是在故意欺骗你的用户,这在某些国家可能是犯罪行为。就像"进监狱,拿不到200美元"

以下是一些示例(完整的标签集请参阅p3pwriter):

NOI : "Web Site does not collected identified data." (as soon as there's any customization, a login, or any data collection (***** Analytics, anyone?), you must acknowledge it in your P3P) STP: Information is retained to meet the stated purpose. This requires information to be discarded at the earliest time possible. Sites MUST have a retention policy that establishes a destruction time table. The retention policy MUST be included in or linked from the site's human-readable privacy policy." (so if you send STP but don't have a retention policy, you may be committing fraud. How cool is that? Not at all.)

我不是律师,但我不愿意去法庭上看看P3P头是否真的具有法律约束力,或者你是否可以在不愿意履行承诺的情况下向用户承诺任何东西。

在Rails 3.2中,我使用:

class ApplicationController < ActionController::Base  

  before_filter :set_p3p  

  private  
    # for IE session cookies thru iframe  
    def set_p3p  
      headers['P3P'] = 'CP="ALL DSP COR CURa ADMa DEVa OUR IND COM NAV"'  
    end  
end  

我从http://dot-net-web-developer-bristol.blogspot.com/2012/04/setting-p3p-header-in-rails-session.html得到了这个

我正在调查这个关于通过Azure访问控制服务登录的问题,并且无法连接任何东西的头部和尾部。

然后,无意中看到了这个帖子https://blogs.msdn.microsoft.com/ieinternals/2011/03/10/beware-cookie-sharing-in-cross-zone-scenarios/

简而言之,IE不会跨区域共享cookie。互联网vs.可信站点)。

所以,如果你的IFrame目标和html页面在不同的区域的P3P不会有任何帮助。

如果你拥有需要嵌入的域,那么你可以,在调用包含IFrame的页面之前,重定向到那个域,它将创建cookie并重定向回来, 如下所述:http://www.mendoweb.be/blog/internet-explorer-safari-third-party-cookie-problem/

这不仅适用于ie浏览器,也适用于Safari浏览器(因为Safari浏览器也会屏蔽第三方cookie)。