我有两个网站,让's say they' re example.com
和 anotherexample.net
. 在 anotherexample.net/page.html
,我有 IFRAME SRC="http://example.com/someform.asp"
. IFRAME显示一个表单供用户填写并提交给 http://example.com/process.asp
. 当我在自己的浏览器窗口中打开表单(“ someform.asp
”)时,一切正常 . 但是, when I load someform.asp as an IFRAME in IE 6 or IE 7, the cookies for example.com are not saved. 在Firefox中没有出现此问题 .
出于测试目的,我在http://newmoon.wz.cz/test/page.php上创建了类似的设置 .
example.com
使用基于cookie的会话(我无能为力),所以没有cookie, process.asp
将不会执行 . How do I force IE to save those cookies?
嗅探HTTP流量的结果:在GET /someform.asp响应中,有一个有效的每会话Set-Cookie头(例如 Set-Cookie: ASPKSJIUIUGF=JKHJUHVGFYTTYFY
),但在POST /process.asp请求中,根本没有Cookie头 .
Edit3:一些AJAX服务器端脚本显然能够回避问题,但这看起来非常像一个bug,而且它打开了一整套新的security holes . 我不容易 .
编辑: P3P policy was the root cause ,完整说明如下 .
22 回答
这是一个关于这个问题的一个很好的主题,但我发现一个重要的细节(至少在我的情况下是必不可少的)没有发布在这里或其他任何地方(我道歉,如果我错过了它)是P3P线必须是从第三方服务器发送的 EVERY 文件的 Headers 中传递,甚至文件未设置或使用诸如Javascript文件或图像之类的cookie . 否则cookie将被阻止 . 我在这里的帖子中有更多内容:http://posheika.net/?p=110
我得到了它的工作,但解决方案有点复杂,所以忍受我 .
发生了什么事
实际上,Internet Explorer对IFRAME页面的信任程度较低(IE称之为“第三方”内容) . 如果IFRAME中的页面没有隐私政策,则其cookie将被阻止(状态栏中的眼睛图标表示,当您单击它时,它会显示阻止的URL列表) .
the evil eye http://stuff.piskvor.org/cookies_blocked_MSIE_eye.png
在这种情况下,当cookie被阻止时,不会发送会话标识符,并且目标脚本会抛出“找不到会话”错误 .
(我已经尝试将会话标识符设置为表单并从POST变量加载它 . This would have worked ,但出于政治原因,我不能这样做 . )
可以使IFRAME中的页面更可信: if the inner page sends a P3P header with a privacy policy that is acceptable to IE, the cookies will be accepted .
如何解决它
创建p3p策略
一个很好的起点是W3C tutorial . 我已经完成了它,下载了IBM Privacy Policy Editor并在那里我创建了一个隐私政策的代表,并给它一个名称来引用它(这里是
policy1
) .NOTE :此时,您确实需要了解您的网站是否有隐私政策,如果没有,请创建它 - 是否收集用户数据,什么类型的数据,它对它有什么作用,谁有权访问它,等你需要找到这些信息并考虑一下 . Just slapping together a few tags will not cut it. 此步骤不能完全用软件完成,而且可能具有高度政治性(例如"should we sell our click statistics?") .
(例如“该站点由ACME有限公司运营,它使用匿名的每会话标识符进行操作,仅在明确允许的情况下收集用户数据,并且仅出于以下目的,数据仅在必要时存储,仅限我们的公司可以访问它等 . “) .
(使用此工具进行编辑时,可以查看策略中的错误/遗漏 . 另外非常有用的是“HTML政策”选项卡:在底部,它有一个“政策评估” - 快速检查政策是否会被阻止按IE的默认设置)
编辑器导出到.p3p文件,该文件是上述策略的XML表示形式 . 此外,它可以导出此策略的“紧凑版本” .
链接到该政策
然后需要一个策略引用文件(
http://example.com/w3c/p3p.xml
)(该站点使用的隐私策略索引):<INCLUDE>
显示将使用此策略的所有URI(在我的情况下,整个站点) . 我从编辑器导出的策略文件已上传到http://example.com/w3c/example-com.p3p
发送包含响应的紧凑 Headers
我在example.com上设置了webserver,发送带有响应的紧凑头,如下所示:
policyref
是策略引用文件的相对URI(后者又引用隐私策略),CP
是紧凑策略表示 . Note that the combination of P3P headers in the example may not be applicable on your specific website; your P3P headers MUST truthfully represent your own privacy policy!利润!
在此配置中,Evil Eye不会出现,即使在IFRAME中也会保存Cookie,并且应用程序可以正常运行 .
编辑:什么不该做,除非你喜欢为诉讼辩护
有几个人建议“只需将一些标签贴在你的P3P Headers 上,直到邪恶的眼睛放弃” .
标签不仅是一堆,它们有 real world meanings ,它们的使用给你 real world responsibilities !
例如,假装您从不收集用户数据可能会使浏览器满意,但如果您实际收集用户数据,则P3P与现实冲突 . 简单明了,这可能是某些国家的犯罪行为 . 如,"go to jail, do not collect $200" .
几个例子(see p3pwriter for the full set of tags):
NOI :"Web Site does not collected identified data."(只要有任何自定义,登录或任何数据收集(***** Analytics,任何人?),您 must 在您的P3P中确认它)
STP :保留信息以满足规定的目的 . 这要求尽可能早地丢弃信息 . 站点必须具有 Build 销毁时间表的保留策略 . 保留政策必须包含在网站的人类可读隐私政策中或与之相关联 . “(如果您发送
STP
但没有保留政策,您可能正在进行欺诈 . 多么酷啊?一点也不 . )我不愿意去法院看看P3P Headers 是否真的具有法律约束力,或者你是否可以向用户承诺任何事情而不愿意兑现你的承诺 .
我花了很大一部分时间来研究这个P3P的事情,我觉得有必要分享我发现的东西 .
我注意到P3P概念已经过时,似乎只是由Internet Explorer(IE)真正使用/强制执行 .
最简单的解释是:如果您使用cookie,IE希望您定义P3P标头 .
这是一个不错的主意,幸运的是大多数时候不提供此 Headers 不会导致任何问题(阅读浏览器警告) . 除非您的网站/网络应用程序使用(i)框架加载到其他网站 . 这就是IE成为***的巨大痛苦的地方 . 除非设置了P3P标头,否则它不允许您设置cookie .
知道了这一点,我想找到以下两个问题的答案:
谁在乎?换句话说,如果我在 Headers 中加上单词"Potato",我可以被起诉吗?
其他公司做什么?
我的发现是:
无人问津 . 我找不到世界上一个采用法律阻止你在P3P Headers 中加入单词"Potato"的国家/地区
谷歌和Facebook都在他们的P3P Headers 字段中放置了一个链接,引用了一个页面,描述了他们没有P3P Headers 的原因 .
这个概念诞生于2002年,令我感到困惑的是,这个过时的,法律上未实现的概念仍然强加于IE中的开发人员 . 如果此标头没有任何合法的后果,则应忽略此标头(或者,在控制台中生成警告或通知) . 没有强制执行!我现在被迫在我的代码中添加一行(并向客户端发送一个 Headers ),它绝对没有任何作用 .
简而言之 - 保持IE的快乐 - 在PHP代码中添加以下行(其他语言应该类似)
问题解决了,IE很满意这个土 beans .
通过简单地将这个小 Headers 添加到IFrame(PHP解决方案)中的网站,我就能够消除邪恶之眼:
Remember to press ctrl+F5 重新加载您的网站或资源管理器可能仍然显示邪恶的眼睛,尽管它的工作正常 . 这可能是我遇到这么多问题的主要原因 .
根本没有必要的政策文件 .
编辑:我发现了一个很好的博客文章,解释了IFrame中的cookie问题 . 它还可以快速修复C#代码:Frames, ASPX Pages and Rejected Cookies
这隐藏在其他答案的评论中,但我差点错过了,所以看起来它应该得到自己的答案 .
要查看:为了让IE接受第三方cookie,您需要使用名为p3p的http标头以下列格式提供文件:
但是,p3p在这一点上已经非常死了,你可以轻松地让IE工作,而无需投入时间和法律资源来创建真正的p3p策略 . 这是因为如果您的压缩p3p策略标头无效,IE实际上将其视为一个好的策略并接受第三方cookie . 所以你可以使用像这样的p3p头
你可以选择包含一个页面链接,解释为什么你没有p3p政策,就像谷歌和Facebook那样(他们指的是:https://support.google.com/accounts/answer/151657和这里:https://www.facebook.com/help/327993273962160/) .
最后,重要的是要注意从第三方站点提供的所有文件都需要有p3p标头,而不仅仅是设置cookie的文件,因此您可能无法在PHP,asp.net等中执行此操作 . 码 . 您可能最好在Web服务器级别(即在IIS或Apache中)进行设置 .
我也有这个问题,以为我'd post the code that I used in my MVC2 project. Be careful when in the page life cycle you add in the header or you'会得到一个HttpException“ Server cannot append header after HTTP headers have been sent ” . 我在OnActionExecuting方法上使用了自定义ActionFilterAttribute(在执行操作之前调用) .
使用示例:
任何在node.js中遇到此问题的人 .
然后添加此p3p模块,并在中间件上启用此模块 .
我正在使用快递,所以我在app.js中添加它
首先要求app.js中的模块
然后用它作为中间件
它将在res对象中添加p3p标头 . 不需要做任何额外的事情 .
您将获得更多信息:
https://github.com/troygoode/node-p3p
如果有人在寻找Apache系列;我们用过这个 .
只要有P3P Headers ,我们将CP值设置为什么并不重要 .
一个可能的做法是将域添加到工具中允许的站点 - >互联网选项 - >隐私 - >网站:somedomain.com - >允许 - >好的 .
This post提供了一些关于P3P的评论和一个简化的解决方案,可以减少IE7和IE8的问题 .
我在这里没有提到的一个解决方案是使用session storage而不是cookie . 当然,这可能不适合每个人's requirements, but for some cases it'一个简单的解决方案 .
我正在调查有关通过Azure Access Control Services登录的问题,并且无法连接任何内容的正面和尾部 .
然后,偶然发现了这篇文章https://blogs.msdn.microsoft.com/ieinternals/2011/03/10/beware-cookie-sharing-in-cross-zone-scenarios/
简而言之,IE不跨区域共享cookie(例如,Internet与可信站点) .
因此,如果你的IFrame目标和html页面位于不同的区域,P3P对任何事情都无济于事 .
有类似的问题,也去调查今天早上如何生成P3P策略,这里是关于如何生成自己的策略并在网站上使用的帖子:) http://everydayopenslikeaflower.blogspot.com/2009/08/how-to-create-p3p-policy-and-implement.html
我之前已经实施了完整的P3P政策,但不想再为我正在开展的新项目解决麻烦 . 我发现此链接对于问题的简单解决方案很有用,只需指定“CAO PSA OUR”的最小紧凑P3P策略:
http://blog.sweetxml.org/2007/10/minimal-p3p-compact-policy-suggestion.html
该文引用了一个(现已破碎)链接到Microsoft kb文章 . 政策为我做了诀窍!
您还可以将p3p.xml和policy.xml文件组合在一起:
/home/ubuntu/sites/shared/w3c/p3p.xml
我发现添加标头的最简单方法是通过Apache代理并使用mod_headers,如下所示:
因此我们将除了/w3c/p3p.xml之外的所有请求代理到我们的应用服务器 .
您可以使用W3C validator进行全部测试
If you own the domain that needs to be embedded ,那么你可以在调用包含IFrame的页面之前,重定向到该域,这将创建cookie并重定向回来,如下所述:http://www.mendoweb.be/blog/internet-explorer-safari-third-party-cookie-problem/
这适用于Internet Explorer,但也适用于Safari(因为Safari也会阻止第三方cookie) .
我知道我在这个问题上做出贡献有点晚了,但我失去了很多时间,也许这个答案对某些人有帮助 .
我试图在我的网站上调用第三方cookie,当然即使在安全级别较低的情况下它也无法在Internet Explorer 10上运行...不要问我原因 . 在iframe中,我用ajax调用了read_cookie.php(echo $ _COOKIE) .
我不知道为什么我无法设置P3P政策来解决问题......
在我的搜索过程中,我看到了一些关于在JSON中使用cookie的工作 . 我甚至没有尝试,因为我认为如果cookie不会通过iframe,它将不再通过数组...
猜猜看是什么!因此,如果你对你的cookie进行json_encode,那么在你的ajax请求之后解码,你就会得到它!
也许有一些我错过的东西,如果我这样做,我所有的道歉,但我从未见过如此愚蠢的东西 . 为安全起见阻止第三方cookie,为什么不,但如果编码则让它通过?安全现在在哪里?
我希望这篇文章会对某人有所帮助,如果我错过了一些东西而且我很蠢,请教育我!
这最终对我有用(经过大量的hastle并使用IBM的策略生成器生成一些策略) . 您可以在此处下载策略生成器:http://www.softpedia.com/get/Security/Security-Related/P3P-Policy-Editor.shtml
我无法再从官方IBM网站下载该生成器 .
我在Web-App的根文件夹中创建了这些文件
在Rails中我正在使用这个gem:https://github.com/merchii/rack-iframe从本质上讲,它设置了一组没有引用文件的缩写:https://github.com/merchii/rack-iframe/blob/master/lib/rack/iframe.rb#L8
当你完全不关心p3p的含义时,它很容易安装 .
对于任何试图让P3P Compact Policy使用静态内容的人:
如果您能够使用静态内容发送自定义服务器端响应标头,则可能是 only .
有关更详细的说明,请参阅我的答案:Set P3P code in HTML
在Rails 3.2中我使用:
我得到了这个:http://dot-net-web-developer-bristol.blogspot.com/2012/04/setting-p3p-header-in-rails-session.html
一个更好的解决方案是在iframe内部进行Ajax调用,以获取/设置cookie ...