Internet Explorer中IFRAME中的Cookie被阻止/未保存

399
我有两个网站,假设它们是 example.comanotherexample.net。在 anotherexample.net/page.html 页面上,我有一个 IFRAME SRC="http://example.com/someform.asp",显示一个表单供用户填写并提交到http://example.com/process.asp。当我在单独的浏览器窗口中打开这个表单("someform.asp")时,一切正常。但是,在 IE 6 或 IE 7 中将 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 头部。
编辑3:一些AJAX+服务器端脚本似乎能够避开这个问题,但这看起来非常像一个漏洞,而且它会打开一整套安全漏洞。我不想让我的应用程序使用一个由于易用性而组合了漏洞和安全漏洞的方法。
编辑:P3P策略是根本原因,完整解释如下。

确实是一个好的解决方案。我尝试创建隐私政策,将其添加到我的上下文根中,在我的JSP页面中设置了头文件,但仍然无法摆脱那个红眼睛。你能帮我解决这个问题吗? - user902490
感谢@Piskvor提供的演示网站,我在这个Security.SE帖子中引用了它,该帖子列出了具有交互式浏览器测试的网站。 - makerofthings7
@makerofthings7:不客气。我会将其迁移到一个非临时(sic!)网站,并建议在Security.se上进行编辑,该页面是一种有点粗糙的概念证明。 - Piskvor left the building
2
不要试图在Windows 10 / Internet Explorer 11中运行P3P(https://msdn.microsoft.com/en-us/library/mt146424%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396)。 P3P根本不起作用,因此无论您做什么,Cookie都不会被存储。这里也有证据http://www.enhanceie.com/test/cookie/。 - puco
22个回答

432

我已经解决了问题,但是解决方案有点复杂,请您耐心等待。

发生了什么

目前,Internet Explorer在处理IFRAME页面(IE称之为“第三方”内容)时会给予更低的信任级别。如果IFRAME内部的页面没有隐私政策,它的cookies将被阻止(通过点击状态栏中的眼睛图标,可以显示一个被阻止URL的列表)。

the evil eye
(来源:piskvor.org)

在这种情况下,当cookies被阻止时,会导致会话标识符未被发送,目标脚本就会抛出“找不到会话”的错误。

(我曾尝试将会话标识符设置到表单中并从POST变量中加载。 这本来可以解决问题,但由于某些政治原因,我无法这样做。)

可以使IFRAME内部的页面更受信任:如果内部页面发送了一个带有可接受于IE的隐私政策的P3P标头,那么cookies将被接受

如何解决

创建一个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(在我的情况下,整个站点)。我从编辑器中导出的策略文件已上传到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标头必须真实地代表您自己的隐私政策!

利润!

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

编辑:除非你喜欢被诉讼,否则不要这样做

有几个人建议“只需将一些标签放入P3P标头中,直到邪眼放弃”。

这些标签不仅是一堆位,它们还具有现实世界的含义,它们的使用给您带来真实的责任

例如,假装您从未收集用户数据可能会使浏览器感到满意,但如果您实际收集用户数据,则P3P与现实冲突。简单明了,您正在故意欺骗用户,在某些国家可能构成犯罪行为。例如,“入狱,不要收取200美元”。

一些示例(请参阅p3pwriter获取完整的标签集):

  • NOI:“网站不收集已确定的数据。”(只要有任何定制、登录或任何数据收集(*****Analytics,任何人?),您必须在P3P中承认它)
  • STP:信息保留以满足规定目的。这需要尽快丢弃信息。站点必须有一个保留政策,以建立销毁时间表。保留政策必须包含在或链接到站点的可读性隐私政策中。”(因此,如果您发送STP但没有保留政策,则可能会构成欺诈。多酷啊?根本不酷。)

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


我已经完成了95%,但我的头部只写了:P3P: CP="....",并没有包含policyref链接,这导致它在IE7中可以工作,但在IE6中不能...现在运行良好。谢谢! - AndreasKnudsen
4
IBM编辑器的链接已经不能使用了。通过Wayback Machine,我找到了这个可用的链接:https://www6.software.ibm.com/sdfdl/1v2/regs2/awadmin/p3peditor/Xa.2/Xb.NoLhAb4K_rojPMDtnyyo2JnmTVdfbD3Atd9mbtycww/Xc.p3peditor/p3pExecutableJar.zip/Xd./Xf.LPr.U1ay/Xg.6235844/Xi.AW-033/XY.regsrvs/XZ.5bFtxV6ua5i-evcgQ4iqnCWRip4/p3pExecutableJar.zip。 - ripper234
34
关于此话题的一些新闻: -IBM编辑器可以在此链接找到:http://www.softpedia.com/get/Security/Security-Related/P3P-Policy-Editor.shtml。 -P3P标准似乎已经“死亡”。 像Google和Facebook这样的大公司现在使用无效的P3P头部来绕过IE安全性。请参见以下文章:http://www.cylab.cmu.edu/research/techreports/2010/tr_cylab10014.html,http://www.zdnet.com/blog/facebook/facebook-to-microsoft-p3p-is-outdated-what-else-ya-got/9332,http://www.techpolicy.com/Cranor_InternetExplorerPrivacyProtectionsBeingCircumvented-by-Google.aspx。 - Davide Icardi
7
可以帮助遇到类似问题的人的另一个信息是:经过我的测试,如果域名位于不同的安全区域中(例如第一方为互联网,第三方为内部网络),即使P3P正确配置,也无法接受第三方cookie。该cookie始终会被阻止。 - Davide Icardi
1
需要注意的是,“第三方”这个术语并不像人们想象的那么清晰明了。如果一个 iframe 相对于封闭站点具有第三方内容,并且具有有效的隐私政策,并且它重定向到来自主站点的 iframe 视图,那么除非该视图具有有效的隐私政策,否则 IE 将不信任其 cookie。即使该视图来自包含 iframe 的站点相同。 - Fares
显示剩余5条评论

170

我花了一大部分时间研究P3P,感觉有必要分享一下我的发现。

我注意到P3P的概念非常过时,似乎只有Internet Explorer (IE)真正使用/执行它。

最简单的解释是:如果你使用cookies,IE希望你定义一个P3P标头。

这是一个好主意,幸运的是,大多数情况下不提供此标头不会导致任何问题(请阅读浏览器警告)。除非你的网站/ Web应用程序被加载到使用(i)Frame的其他网站中。这就是IE变得非常麻烦的地方。如果没有设置P3P标头,它将不允许您设置cookie。

基于此,我想找到以下两个问题的答案:

  1. 有谁在关注?换句话说,如果我在标题中放置“土豆”这个词,我会被起诉吗?
  2. 其他公司怎么做?

我的发现是:

  1. 没有人在关注。我无法找到任何文件表明这项技术具有任何法律效力。在我的研究期间,我没有发现世界上任何一个国家实施了防止您在P3P标头中放置“土豆”这个词的法律。
  2. Google和Facebook都在其P3P标头字段中放置了一个链接,引用了一个页面描述为什么它们没有P3P标头。

这个概念诞生于2002年,让我感到困惑的是,这个过时且未被实施的概念仍然被强加给IE中的开发人员。

如果这个标头没有任何法律后果,那么应该忽略这个标头(或者在控制台中生成警告或通知)。不被执行!现在我被迫在我的代码中添加一行(并向客户端发送一个标头),但却毫无作为。

简而言之 - 为了让IE满意 - 在您的PHP代码中添加以下行(其他语言应该类似):

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

问题已解决,IE 也对这个土豆感到满意。


6
确实,自2008年发布此文章以来,这个问题已经发生了显著变化。网络已经进步了,对于P3P的共识已经稳定为“没人再关心它了”。知道IE在这种情况下如何处理无效输入是很好的。 - Piskvor left the building
20
哇,这是网络浏览器隐藏功能中的佳品! HttpContext.Current.Response.AddHeader("p3p", "CP="Internet Explorer Was Programmed By Idiots""); 这个对我有效! - Michiel Cornille
6
不要责怪开发人员,这更多是与律师和管理层有关的问题。我猜大多数开发人员意识到这个功能会导致类似于Potato的解决方案。 - KajMagnus
5
对于 ASP.Net,您可以将以下内容添加到您的 web.config 文件中: '<system.webServer> <handlers> <httpProtocol> <customHeaders> <add name="p3p" value="CP="Internet Explorer 需要此项设置方可设置第三方 Cookie"" /> </customHeaders> </httpProtocol> </handlers> </system.webServer>' 这样做可以设置第三方 Cookies,以便与 Internet Explorer 兼容。 - Rick Kierner
1
如果你是丹·奎尔,你必须使用 header('P3P: CP="Potatoe"'); - nurikabe
显示剩余6条评论

57

我能够通过在IFrame中添加以下小标题(PHP解决方案)来消除“恶眼”:

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

记得按下ctrl+F5重新加载您的网站或资源管理器,否则即使它正常工作,它也可能仍然显示错误。这可能是我在让它正常工作方面遇到很多问题的主要原因。

根本不需要任何策略文件。

编辑: 我找到了一篇很好的博客文章,解释了IFrame中cookie的问题。它还提供了C#代码的快速修复方法: Frames, ASPX Pages and Rejected Cookies


10
虽然我不是法律专家,但P3P政策似乎具有法律约束力。你是否了解你在向用户承诺什么,或者你只是随意混合标签直到信息收集停止?我认为浏览器缓存不会是你面临的最大问题: "NOI:此网站不收集身份数据。 STP:信息被保留以满足声明的目的。这需要信息在最早可能的时间被丢弃。站点必须有一个保留政策来建立一个销毁时刻表。保留政策必须包含在或链接从网站的人类可读的隐私政策中。" - Piskvor left the building
28
我必须承认,我并不真的关心它的含义,我只是需要让东西在浏览器中正常工作。这些网站是我们自己的非公开网站之一使用 cookie 来“记住”在网站中显示的样式。 所以,是的,我只是混合标签直到邪恶的眼睛消失了。 - Helo
6
P3P的日益不重要。如果它是如此具有法律约束力,那么现在肯定已经有先例证明了。它被视为非常重要,所以我竞争对手中除了一个人外都会首先发布它。他们必须认为,如果他们的客户不能将IE设置为中等级,那么他们就不值得这样做。如果没有 cookie ,销售额在一个网站上的损失必须相当高,否则购物车就会失效。 - Fiasco Labs
“我不是律师,但我会根据我在互联网上找到的PDF文件给你提供法律建议。”嗯... - EricLaw
3
这个答案建议使用像CP="This_is_not_a_privacy_policy"这样的虚拟标头。我觉得这样做似乎不太具有法律约束力(因为没有提到 NOI 和 STP 等内容),并且显然可以让 IE 正常工作 :-) - KajMagnus
显示剩余3条评论

21

这段话被深埋在其他回答的评论中,但我差点错过了它,看起来它应该有它自己的回答。

回顾一下:为了让IE接受第三方cookie,您需要使用名为P3P的HTTP头以以下格式提供您的文件:

CP="my compact p3p policy"

但是,目前来看,P3P标准基本上已经死亡,您可以很容易地使IE正常工作,而无需投入时间和法律资源来创建真正的P3P策略。这是因为如果您的紧凑型P3P策略头无效,IE实际上会将其视为良好策略并接受第三方Cookie。因此,您可以使用这样的P3P头:

CP="This site does not have a p3p policy."

你可以选择包含一个链接到一个页面,解释为什么你没有一个 P3P 策略,就像谷歌和 Facebook 所做的一样(他们分别指向这里:https://support.google.com/accounts/answer/151657 和 这里:https://www.facebook.com/help/327993273962160/)。

最后,需要注意的是,所有从第三方站点提供的文件都需要有 P3P 头,不仅仅是设置 cookie 的那个文件,因此你可能不能只在 PHP、asp.net 等代码中实现它。最好在 Web 服务器层面上设置它(例如 IIS 或 Apache)。


20

我也遇到了这个问题,所以想分享一下我在MVC2项目中使用的代码。当添加页眉时,请注意页面生命周期,否则你会收到一个HttpException "服务器无法在HTTP标头发送后追加标头"。我在OnActionExecuting方法上使用了自定义的ActionFilterAttribute(在执行操作之前调用)。

/// <summary>
/// Privacy Preferences Project (P3P) serve a compact policy (a "p3p" HTTP header) for all requests
/// P3P provides a standard way for Web sites to communicate about their practices around the collection, 
/// use, and distribution of personal information. It's a machine-readable privacy policy that can be 
/// automatically fetched and viewed by users, and it can be tailored to fit your company's specific policies.
/// </summary>
/// <remarks>
/// More info http://www.oreillynet.com/lpt/a/1554
/// </remarks>
public class P3PAttribute : ActionFilterAttribute
{
    /// <summary>
    /// On Action Executing add a compact policy "p3p" HTTP header
    /// </summary>
    /// <param name="filterContext"></param>
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        HttpContext.Current.Response.AddHeader("p3p","CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"");

        base.OnActionExecuting(filterContext);
    }
}

用例示例:

[P3P]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome!";

        return View();
    }

    public ActionResult About()
    {
        return View();
    }
}

14

这是关于这个问题的一个很好的主题,然而我发现一个重要的细节(在我的情况下至少是必要的),这个细节没有发布在这里或任何其他地方(如果我错过了,我道歉),就是 每个从第三方服务器发送的文件都必须在头信息中传递P3P行,即使文件没有设置或使用cookie,例如Javascript文件或图像文件。否则,cookie将被阻止。我在这篇文章中有更多内容:http://posheika.net/?p=110


5

如果有人在寻找Apache行的话,我们使用了以下内容:

Header set P3P "CP=\"Thanks IE8\""

实际上,无论我们将CP值设置为什么,只要有P3P头信息就可以了。


5

有人在使用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


4

可能的解决方法之一是将该域名添加到允许的网站列表中。具体操作是:工具 -> 互联网选项 -> 隐私 -> 站点:somedomain.com -> 允许 -> 确定。


23
是的,如果你只关心它在你的电脑上能否工作。但建议对每个访客都这样做并不完全切实际。 - Piskvor left the building

3

这篇文章提供了有关P3P的评论以及一种快捷解决方案,可减少IE7和IE8的问题。


1
引用文章中的话:“基本上它说‘我们不会收集任何你的个人数据’”- 祝你好运。我从未见过有一个网站真正遵守了这个政策(不收集任何数据,甚至是匿名的统计数据 - 服务器访问日志,有人吗?)。提供的另一个政策也很难实现(你有任何类型的网络分析吗?砰,你刚刚违反了你的P3P政策)。因此,这篇文章可以总结为“只要大胆地撒谎,没人在乎”。确实是整个互联网上最有用的文章。 - Piskvor left the building
@Piskvor 从“互联网上最有用的帖子..”链接到兄弟网站http://www.p3pwriter.com/LRN_141.asp,这似乎表明P3P的合法性已经有了先例。仅供参考。 - maxwellb
1
@Piskvor - 请发布免费的P3P工具。我尝试访问的所有工具都被链接农场和虚假搜索收购了。IBM撤回了他们的免费工具。2012年,P3P支持似乎像干旱中枯死的草一样。 - Fiasco Labs
@Fiasco Labs:P3P编辑器似乎又浮出水面了,被另一个用户发现-请参见问题评论中的链接。 - Piskvor left the building
2
在Softpedia上找到了IBM Alphaworks的P3P编辑器:http://www.softpedia.com/get/Security/Security-Related/P3P-Policy-Editor.shtml - Fiasco Labs
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接