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

我有两个网站,假设他们是example.comanotherexample.net 。 在anotherexample.net/page.html ,我有一个IFRAME SRC="http://example.com/someform.asp" 。 该IFRAME显示一个表格供用户填写并提交至http://example.com/process.asp 。 当我在自己的浏览器窗口中打开表单(“ someform.asp ”)时,一切正常。 但是, 当我在IE 6或IE 7中以IFRAME的形式加载someform.asp时,不会保存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 +服务器端脚本显然能够避开这个问题,但这看起来非常像一个bug,再加上它会打开一整套新的安全漏洞。 我不希望我的应用程序使用错误+安全漏洞的组合,只是因为它很容易。

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


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

发生了什么

实际上,Internet Explorer对IFRAME页面的信任程度较低(IE称为“第三方”内容)。 如果IFRAME内的页面没有隐私政策,则其Cookie被阻止(状态栏中的眼睛图标表示它,当您点击它时,它会显示一个阻止的URL列表)。

邪恶之眼http://stuff.piskvor.org/cookies_blocked_MSIE_eye.png

在这种情况下,当cookie被阻塞时,会话标识符不会被发送,并且目标脚本会引发'未找到会话'错误。

(我已经尝试将会话标识符设置为表单并从POST变量中加载它, 这可能会起作用 ,但出于政治原因,我无法做到这一点。)

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

如何解决它

创建一个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上设置了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标题必须真实地代表您自己的隐私政策!

利润!

在这种配置下,邪恶之眼不会出现,cookie即使在IFRAME中也会保存,并且应用程序可以正常工作。

编辑:除非你喜欢从法律诉讼中捍卫,否则不要做

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

标签不仅仅是一堆,它们具有真实的世界意义 ,它们的使用赋予您真正的世界责任

例如,假装你从不收集用户数据可能会使浏览器感到高兴,但如果你实际收集用户数据,P3P就会与现实相冲突。 简单而简单, 你有意向用户说谎 ,这在某些国家可能是犯罪行为。 如在“入狱,不要收200美元”。

一些例子(见全套标签的p3pwriter):

  • NOI :“网站不收集识别的数据。” (只要有任何定制,登录或任何数据收集(*****分析,任何人?),您必须在您的P3P中承认)
  • STP :保留信息以符合规定的目的。 这要求信息在尽可能早的时候被丢弃。 网站必须有保留策略来建立销毁时间表。 保留策略必须包含在网站的人们可以阅读的隐私政策中,或者链接到该网站的隐私政策。“(因此,如果您发送STP但没有保留策略,那么您可能会犯下欺诈行为,这是多么酷?完全没有。)
  • 我不是律师,但我不愿意去法院看看P3P标题是否真的具有法律约束力,或者您是否可以向您的用户承诺任何内容而不真正兑现承诺。


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

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

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

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

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

  • 谁在乎? 换句话说,如果我在标题中加入“土豆”一词,我可以被起诉吗?
  • 其他公司做什么?
  • 我的发现是:

  • 没人在乎。 我无法找到表明此技术具有任何法定权重的单个文档。 在我的研究期间,我没有发现世界各地的一个国家采取了一项法律,禁止您在P3P标题中加入“土豆”一词
  • Google和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#代码:框架,ASPX页面和拒绝Cookies

    链接地址: http://www.djcxy.com/p/28065.html

    上一篇: Cookie blocked/not saved in IFRAME in Internet Explorer

    下一篇: Practical difference between List and IEnumerable