我有两个网站,让我们说他们是example.com
和anotherexample.net
.上anotherexample.net/page.html
,我有一个IFRAME SRC="https://img.devbox.cn/3cccf/16086/243/367c4539743ff9b8.png" alt="邪恶的眼睛">
(来源:piskvor.org)
在这种情况下,当cookie被阻止时,不会发送会话标识符,并且目标脚本会抛出"找不到会话"错误.
(我已经尝试将会话标识符设置为表单并从POST变量加载它.这本来有用,但出于政治原因,我不能这样做.)
可以使IFRAME 内的页面更加可信:如果内页发送带有IE可接受的隐私策略的P3P标头,则将接受cookie.
如何解决它一个很好的起点是W3C教程.我已经浏览了它,下载了IBM隐私政策编辑器,在那里我创建了隐私政策的表示,并给它起了一个名称来引用它(现在是policy1
).
注意:此时,您实际上需要了解您的网站是否有隐私政策,如果没有,请创建它 - 是否收集用户数据,什么类型的数据,它使用它做什么,谁有权访问它,等你需要找到这些信息并考虑一下.只是拼凑几个标签不会削减它.这个步骤不能仅仅在软件中完成,并且可能具有高度政治性(例如"我们应该销售点击统计数据吗?").
(例如"该网站由ACME有限公司运营,它使用匿名的每会话标识符进行操作,仅在明确允许的情况下收集用户数据,仅用于以下目的,数据仅在必要时存储,仅限我们的公司可以访问它等.").
(使用此工具进行编辑时,可以查看策略中的错误/遗漏.同样非常有用的是"HTML政策"选项卡:在底部,它有一个"政策评估" - 快速检查政策是否会被阻止按IE的默认设置)
编辑器导出到.p3p文件,该文件是上述策略的XML表示形式.此外,它可以导出此策略的"紧凑版本".
然后需要一个Policy Reference文件(http://example.com/w3c/p3p.xml
)(该站点使用的隐私策略索引):
/
该
节目将使用此策略(在我的情况,整个网站)所有的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
policyref
是策略引用文件的相对URI(后者又引用隐私策略),CP
是紧凑的策略表示.请注意,示例中的P3P标头组合可能不适用于您的特定网站; 您的P3P标题必须如实地代表您自己的隐私政策!
在此配置中,Evil Eye不会出现,即使在IFRAME中也会保存Cookie,并且应用程序可以正常运行.
编辑:什么不该做,除非你喜欢辩护诉讼有几个人建议"只需将一些标签贴在你的P3P标题上,直到邪恶的眼睛放弃".
标签不仅是一堆,它们具有现实世界的含义,它们的使用为您提供了现实世界的责任!
例如,假装您从不收集用户数据可能会使浏览器满意,但如果您实际收集用户数据,则P3P与现实冲突.简单明了,你故意对用户撒谎,这可能是某些国家的犯罪行为.如同,"去监狱,不要收200美元".
一些例子(参见完整标签集的p3pwriter):
NOI:"网站没有收集确定的数据." (只要有任何自定义,登录或任何数据收集(*****Analytics,任何人?),您必须在P3P中确认它)
STP:保留信息以满足规定的目的.这要求尽可能早地丢弃信息.站点必须具有建立销毁时间表的保留策略.保留政策必须包含在网站的人类可读隐私政策中或与之相关联."(因此,如果您发送STP
但没有保留政策,您可能会进行欺诈.这有多酷?根本不存在.)
我不是律师,但是我不愿意去法庭看看P3P标题是否真的具有法律约束力,或者你是否可以向用户承诺任何事情而不愿意兑现你的承诺.
我花了很大一部分时间研究这个P3P的事情,我觉得有必要分享我发现的东西.
我注意到P3P概念已经过时,似乎只是被Internet Explorer(IE)真正使用/强制执行.
最简单的解释是:如果您使用cookie,IE希望您定义P3P标头.
这是一个不错的主意,幸运的是大多数时候不提供此标题不会导致任何问题(阅读浏览器警告).除非您的网站/网络应用程序使用(i)框架加载到其他网站.这就是IE成为***的巨大痛苦的地方.除非设置了P3P标头,否则它不允许您设置cookie.
知道了这一点,我想找到以下两个问题的答案:
谁在乎?换句话说,如果我在标题中加上"马铃薯"这个词,我可以被起诉吗?
其他公司做什么?
我的发现是:
没人在乎.我无法找到一个表明该技术具有任何法定重量的文件.在我的研究期间,我没有发现世界各地的一个国家采用了一项法律,阻止你在P3P标题中加入"Potato"一词
谷歌和Facebook都在他们的P3P标题字段中添加了一个链接,引用了一个页面,描述了他们没有P3P标头的原因.
这个概念诞生于2002年,令我感到困惑的是,这个过时的,法律上未实现的概念仍然强加于IE中的开发人员.如果此标头没有任何合法后果,则应忽略此标头(或者,在控制台中生成警告或通知).没有强制执行!我现在被迫在我的代码中添加一行(并向客户端发送一个标题),它绝对没有任何作用.
简而言之 - 保持IE的快乐 - 在PHP代码中添加以下行(其他语言应该类似)
header('P3P: CP="Potato"');
问题解决了,IE很满意这个土豆.
通过简单地将这个小标题添加到IFrame(PHP解决方案)中的网站,我就能够消除邪恶之眼:
header('P3P: CP="NOI ADM DEV COM NAV OUR STP"');
请记住按ctrl + F5重新加载您的网站,或者资源管理器可能仍然显示邪恶的眼睛,尽管它工作正常.这可能是我遇到这么多问题的主要原因.
根本没有必要的政策文件.
编辑:我找到了一个很好的博客文章,解释了IFrame中的cookie问题.它还可以快速修复C#代码: Frames,ASPX Pages和Rejected Cookies
这隐藏在其他答案的评论中,但我几乎错过了它,所以看起来它应该得到自己的答案.
要查看:为了让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政策的原因,如Google和Facebook所做的那样(他们在此处指出:https://support.google.com/accounts/answer/151657此处:https ://www.facebook.com/help/327993273962160/).
最后,重要的是要注意从第三方站点提供的所有文件都需要有p3p标头,而不仅仅是设置cookie的文件,因此您可能无法在PHP,asp.net等中执行此操作.码.您可能最好在Web服务器级别(即在IIS或Apache中)进行设置.
我也有这个问题,以为我会发布我在MVC2项目中使用的代码.在页面生命周期中添加标题时要小心,否则会出现HttpException" 服务器在发送HTTP标头后无法追加标头." 我在OnActionExecuting方法上使用了自定义ActionFilterAttribute(在执行操作之前调用).
////// 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. /// ////// More info http://www.oreillynet.com/lpt/a/1554 /// public class P3PAttribute : ActionFilterAttribute { ////// On Action Executing add a compact policy "p3p" HTTP header /// /// 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(); } }
这是关于这个问题的一个很好的主题,但是我发现一个重要的细节(至少在我的情况下是必不可少的)没有在这里或其他任何地方发布(如果我错过它,我道歉)是P3P线必须是从第三方服务器发送的每个文件的标题中传递,甚至文件没有设置或使用诸如Javascript文件或图像之类的cookie.否则cookie将被阻止.我在这里的帖子中有更多内容:http://posheika.net/?p = 110
任何在node.js中遇到此问题的人.
然后添加此p3p模块,并在中间件上启用此模块.
npm install p3p
我正在使用快递,所以我在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
如果有人在寻找Apache线; 我们用过这个.
标题设置P3P"CP = \"谢谢IE8 \""
只要有P3P标题,我们将CP值设置为什么并不重要.