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


当前回答

任何人在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的事情,我觉得有必要分享我的发现。

我注意到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对这个土豆很满意。

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

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

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

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

对于任何试图让P3P契约策略与静态内容一起工作的人:

只有当您能够发送带有静态内容的自定义服务器端响应标头时才有可能。

有关更详细的解释,请参阅我的回答:在HTML中设置P3P代码

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

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