我有两个网站,比如说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的评论,以及一个减少IE7和IE8问题的捷径解决方案。

其他回答

更好的解决方案是在iframe中对页面进行Ajax调用,以获取/设置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.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验证器进行测试

这篇文章提供了一些关于P3P的评论,以及一个减少IE7和IE8问题的捷径解决方案。

这里没有提到的一种解决方案是使用会话存储而不是cookie。 当然,这可能不适合每个人的要求,但在某些情况下,这是一个很容易解决的问题。