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

Pis*_*3.0 391 cookies internet-explorer privacy p3p

我有两个网站,让我们说他们是example.comanotherexample.net.上anotherexample.net/page.html,我有一个IFRAME SRC="http://example.com/someform.asp".IFRAME显示用户填写并提交的表单http://example.com/process.asp.当我someform.asp在自己的浏览器窗口中打开表单(" ")时,一切正常.但是,当我someform.asp在IE 6或IE 7中作为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,而且还会打开一组全新的安全漏洞.我不希望我的应用程序使用bug +安全漏洞的组合只是因为它很容易.

编辑:P3P政策是根本原因,下面有完整的解释.

Pis*_*3.0 427

我得到了它的工作,但解决方案有点复杂,所以忍受我.

发生了什么

实际上,Internet Explorer对IFRAME页面提供较低级别的信任(IE称之为"第三方"内容).如果IFRAME内的页面没有隐私政策,则其cookie将被阻止(状态栏中的眼睛图标表示,当您单击它时,它会显示被阻止的URL列表).

邪恶的眼睛
(来源:piskvor.org)

在这种情况下,当cookie被阻止时,不会发送会话标识符,并且目标脚本会抛出"找不到会话"错误.

(我已经尝试将会话标识符设置为表单并从POST变量加载它.这本来有用,但出于政治原因,我不能这样做.)

可以使IFRAME 内的页面更加可信:如果内页发送带有IE可接受的隐私策略的P3P标头,则将接受cookie.

如何解决它

创建一个p3p策略

一个很好的起点是W3C教程.我已经浏览了它,下载了IBM隐私政策编辑器,在那里我创建了隐私政策的表示,并给它起了一个名称来引用它(现在是policy1).

注意:此时,您实际上需要了解您的网站是否有隐私政策,如果没有,请创建它 - 是否收集用户数据,什么类型的数据,它使用它做什么,谁有权访问它,等你需要找到这些信息并考虑一下.只是拼凑几个标签不会削减它.这个步骤不能仅仅在软件中完成,并且可能具有高度政治性(例如"我们应该销售点击统计数据吗?").

(例如"该网站由ACME有限公司运营,它使用匿名的每会话标识符进行操作,仅在明确允许的情况下收集用户数据,仅用于以下目的,数据仅在必要时存储,仅限我们的公司可以访问它等.").

(使用此工具进行编辑时,可以查看策略中的错误/遗漏.同样非常有用的是"HTML政策"选项卡:在底部,它有一个"政策评估" - 快速检查政策是否会被阻止按IE的默认设置)

编辑器导出到.p3p文件,该文件是上述策略的XML表示形式.此外,它可以导出此策略的"紧凑版本".

链接到该政策

然后需要一个Policy Reference文件(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>
Run Code Online (Sandbox Code Playgroud)

<INCLUDE>节目将使用此策略(在我的情况,整个网站)所有的URI.我从编辑器导出的策略文件已上传到http://example.com/w3c/example-com.p3p

发送带有响应的紧凑标题

我在example.com上设置了webserver,发送带有响应的紧凑头,如下所示:

HTTP/1.1 200 OK 
P3P: policyref="/w3c/p3p.xml", CP="IDC DSP COR IVAi IVDi OUR TST"
// ... other headers and content
Run Code Online (Sandbox Code Playgroud)

policyref是策略引用文件的相对URI(后者又引用隐私策略),CP是紧凑的策略表示.请注意,示例中的P3P标头组合可能不适用于您的特定网站; 您的P3P标题必须如实地代表您自己的隐私政策!

利润!

在此配置中,Evil Eye不会出现,即使在IFRAME中也会保存Cookie,并且应用程序可以正常运行.

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

有几个人建议"只需将一些标签贴在你的P3P标题上,直到邪恶的眼睛放弃".

标签不仅是一堆,它们具有现实世界的含义,它们的使用为您提供了现实世界的责任!

例如,假装您从不收集用户数据可能会使浏览器满意,但如果您实际收集用户数据,则P3P与现实冲突.简单明了,你故意对用户撒谎,这可能是某些国家的犯罪行为.如同,"去监狱,不要收200美元".

一些例子(参见完整标签集的p3pwriter):

  • NOI:"网站没有收集确定的数据." (只要有任何自定义,登录或任何数据收集(*****Analytics,任何人?),您必须在P3P中确认它)
  • STP:保留信息以满足规定的目的.这要求尽可能早地丢弃信息.站点必须具有建立销毁时间表的保留策略.保留政策必须包含在网站的人类可读隐私政策中或与之相关联."(因此,如果您发送STP但没有保留政策,您可能会进行欺诈.这有多酷?根本不存在.)

我不是律师,但是我不愿意去法庭看看P3P标题是否真的具有法律约束力,或者你是否可以向用户承诺任何事情而不愿意兑现你的承诺.

  • 关于这个主题的一些新闻:-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 (34认同)
  • 另一个可以帮助有类似问题的人的信息:从我的测试中,如果域位于不同的安全区域(例如,第一方是互联网,第三方是内联网),如果P3P正确,则无法接受第三方cookie配置.cookie始终被阻止. (7认同)
  • IBM编辑器的链接不再起作用.通过自由之路机,我能够找到这个工作环节: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 (4认同)

Rub*_*ben 167

我花了很大一部分时间研究这个P3P的事情,我觉得有必要分享我发现的东西.

我注意到P3P概念已经过时,似乎只是被Internet Explorer(IE)真正使用/强制执行.

最简单的解释是:如果您使用cookie,IE希望您定义P3P标头.

这是一个不错的主意,幸运的是大多数时候不提供此标题不会导致任何问题(阅读浏览器警告).除非您的网站/网络应用程序使用(i)框架加载到其他网站.这就是IE成为***的巨大痛苦的地方.除非设置了P3P标头,否则它不允许您设置cookie.

知道了这一点,我想找到以下两个问题的答案:

  1. 谁在乎?换句话说,如果我在标题中加上"马铃薯"这个词,我可以被起诉吗?
  2. 其他公司做什么?

我的发现是:

  1. 没人在乎.我无法找到一个表明该技术具有任何法定重量的文件.在我的研究期间,我没有发现世界各地的一个国家采用了一项法律,阻止你在P3P标题中加入"Potato"一词
  2. 谷歌和Facebook都在他们的P3P标题字段中添加了一个链接,引用了一个页面,描述了他们没有P3P标头的原因.

这个概念诞生于2002年,令我感到困惑的是,这个过时的,法律上未实现的概念仍然强加于IE中的开发人员.如果此标头没有任何合法后果,则应忽略此标头(或者,在控制台中生成警告或通知).没有强制执行!我现在被迫在我的代码中添加一行(并向客户端发送一个标题),它绝对没有任何作用.

简而言之 - 保持IE的快乐 - 在PHP代码中添加以下行(其他语言应该类似)

header('P3P: CP="Potato"');
Run Code Online (Sandbox Code Playgroud)

问题解决了,IE很满意这个土豆.

  • 哦,伙计,这是隐藏的互联网资源管理器之一!HttpContext.Current.Response.AddHeader("p3p","CP = \"Internet Explorer由白痴编程\""); 那一个适合我! (19认同)
  • 事实上,自2008年发布以来,这个问题发生了重大变化.网络已经发展,对P3P的共识已经解决了"无人问津"的问题.很高兴知道IE在这种情况下对无效输入做了什么. (6认同)
  • @Mvision不要责怪开发者,这是一个与律师和管理有关的问题?我猜大多数开发人员都意识到该功能会导致*Potato*之类的解决方案:-) (6认同)
  • 对于ASP.Net,您可以将其添加到您的Web配置:'<system.webServer> <handlers> <httpProtocol> <customHeaders> <add name ="p3p"value ="CP ="Internet Explorer需要此顺序设置第三方Cookie"" /> </ customHeaders> </ httpProtocol> </ handlers> </system.webServer>' (5认同)

Hel*_*elo 55

通过简单地将这个小标题添加到IFrame(PHP解决方案)中的网站,我就能够消除邪恶之眼:

header('P3P: CP="NOI ADM DEV COM NAV OUR STP"');
Run Code Online (Sandbox Code Playgroud)

请记住按ctrl + F5重新加载您的网站,或者资源管理器可能仍然显示邪恶的眼睛,尽管它工作正常.这可能是我遇到这么多问题的主要原因.

根本没有必要的政策文件.

编辑:我找到了一个很好的博客文章,解释了IFrame中的cookie问题.它还可以快速修复C#代码: Frames,ASPX Pages和Rejected Cookies

  • 我必须承认,我真的不在乎它意味着什么,我只需要在资源管理器中工作.这些网站是我们自己的非公共网站,其中一个使用cookie来"记住"显示该网站的样式.所以,是的,我只是混合标签,直到邪恶的眼睛消失. (28认同)
  • IANAL,但P3P政策似乎具有法律约束力.你是否意识到*你在这里向用户承诺的是什么,或者你只是混合标签直到EvilEye消失了?我认为浏览器缓存不会是你最大的问题:"**NOI**:网站不收集已识别的数据.**STP**:保留信息以满足规定的目的.这需要丢弃信息尽可能早.网站必须有一个建立销毁时间表的保留政策.保留政策必须包含在网站的人类可读隐私政策中或与之链接." (10认同)
  • P3P越来越无关紧要.http://www.cylab.cmu.edu/files/pdfs/tech_reports/CMUCyLab10014.pdf如果它具有法律约束力,那么现在要证明这样的诉讼优先权.人们如此高度尊重它,除了我的一个竞争对手之外,其他所有竞争对手都打算首先发布一个.他们必须认为,如果他们的客户不能将IE设置保留在Medium上,他们就不值得付出努力.如果cookie不起作用,一个网站上的销售损失必须相当高,购物车在没有它们的情况下死亡. (6认同)
  • [这个答案](http://stackoverflow.com/a/11462810/694469)建议使用像"CP ="This_is_not_a_privacy_policy"`这样的虚拟标题.这样做看起来似乎没有法律约束力,我认为(因为例如NOI和STP并没有提到任何类似的东西),并且显然让IE很开心:-) (3认同)

Dav*_*ond 21

这隐藏在其他答案的评论中,但我几乎错过了它,所以看起来它应该得到自己的答案.

要查看:为了让IE接受第三方cookie,您需要使用名为p3p的http标头以下列格式提供文件:

CP="my compact p3p policy"
Run Code Online (Sandbox Code Playgroud)

但是,p3p在这一点上几乎已经死了,你可以轻松地让IE工作,而无需投入时间和法律资源来创建真正的p3p策略.这是因为如果您的压缩p3p策略标头无效,IE实际上将其视为一个好的策略并接受第三方cookie.所以你可以使用像这样的p3p头

CP="This site does not have a p3p policy."
Run Code Online (Sandbox Code Playgroud)

您可以选择添加指向页面的链接,以解释您没有p3p政策的原因,如Google和Facebook所做的那样(他们在此处指出:https://support.google.com/accounts/answer/151657此处:https ://www.facebook.com/help/327993273962160/).

最后,重要的是要注意从第三方站点提供的所有文件都需要有p3p标头,而不仅仅是设置cookie的文件,因此您可能无法在PHP,asp.net等中执行此操作.码.您可能最好在Web服务器级别(即在IIS或Apache中)进行设置.


dan*_*lmb 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

使用示例:

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

        return View();
    }

    public ActionResult About()
    {
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 14

这是关于这个问题的一个很好的主题,但是我发现一个重要的细节(至少在我的情况下是必不可少的)没有在这里或其他任何地方发布(如果我错过它,我道歉)是P3P线必须是从第三方服务器发送的每个文件的标题中传递,甚至文件没有设置或使用诸如Javascript文件或图像之类的cookie.否则cookie将被阻止.我在这里的帖子中有更多内容:http://posheika.net/?p = 110


Har*_*shi 5

任何在node.js中遇到此问题的人.

然后添加此p3p模块,并在中间件上启用此模块.

npm install p3p
Run Code Online (Sandbox Code Playgroud)

我正在使用快递,所以我在app.js中添加它

首先要求app.js中的模块

var express = require('express');
var app = express();
var p3p = require('p3p');
Run Code Online (Sandbox Code Playgroud)

然后用它作为中间件

app.use(p3p(p3p.recommended));
Run Code Online (Sandbox Code Playgroud)

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

您将获得更多信息:

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


so_*_*_mv 5

如果有人在寻找Apache线; 我们用过这个.

标题设置P3P"CP = \"谢谢IE8 \""

只要有P3P标题,我们将CP值设置为什么并不重要.