我有两个网站,比如说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行必须在每个文件的头从第三方服务器发送,甚至文件没有设置或使用cookie,如Javascript文件或图像。否则cookie将被阻止。我有更多关于这个的帖子在这里:http://posheika.net/?p=110

其他回答

你也可以将p3p.xml和policy.xml文件结合起来:

单击/ home / ubuntu sites -分享- w3c xml p3p。

<META xmlns="http://www.w3.org/2002/01/P3Pv1">
  <POLICY-REFERENCES>
    <POLICY-REF about="#policy1">
      <INCLUDE>/</INCLUDE>
      <COOKIE-INCLUDE/>
    </POLICY-REF>
  </POLICY-REFERENCES>
  <POLICIES>
    <POLICY discuri="" name="policy1">
      <ENTITY>
        <DATA-GROUP>
          <DATA ref="#business.name"></DATA> 
          <DATA ref="#business.contact-info.online.email"></DATA> 
        </DATA-GROUP>
      </ENTITY>
      <ACCESS>
        <nonident/>
      </ACCESS>
      <!-- if the site has a dispute resolution procedure that it follows, a DISPUTES-GROUP should be included here -->
      <STATEMENT>
        <PURPOSE>
          <current/>
          <admin/>
          <develop/>
        </PURPOSE>
        <RECIPIENT>
          <ours/>
        </RECIPIENT>
        <RETENTION>
          <indefinitely/>
        </RETENTION>
        <DATA-GROUP>
          <DATA ref="#dynamic.clickstream"/>
          <DATA ref="#dynamic.http"/>
        </DATA-GROUP>
      </STATEMENT>
    </POLICY>
  </POLICIES>
</META>

我发现添加头的最简单的方法是通过Apache代理和使用mod_headers,就像这样:

<VirtualHost *:80>
  ServerName mydomain.com

  DocumentRoot /home/ubuntu/sites/shared/w3c/

  ProxyRequests off
  ProxyPass /w3c/ !
  ProxyPass / http://127.0.0.1:8080/
  ProxyPassReverse / http://127.0.0.1:8080/
  ProxyPreserveHost on

  Header add p3p 'P3P:policyref="/w3c/p3p.xml", CP="NID DSP ALL COR"'
</VirtualHost>

因此,除了发送到/w3c/p3p.xml的请求外,我们将所有请求都代理到我们的应用服务器。

您可以使用W3C验证器进行测试

任何人在node.js中遇到这个问题。

然后添加这个p3p模块,并在中间件中启用这个模块。

npm install p3p

我正在使用express,所以我在app.js中添加了它

首先在app.js中需要该模块

var express = require('express');
var app = express();
var p3p = require('p3p');

然后将其用作中间件

app.use(p3p(p3p.recommended));

它将在res对象中添加p3p头文件。不需要做任何额外的事情。

更多信息请访问:

https://github.com/troygoode/node-p3p

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

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

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

我花了一天的大部分时间研究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对这个土豆很满意。

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

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