iframe cookie p3p

问题

参与一个客户端产品的开发,这个产品有几个模块的开发方式是这样的,C++代码调用浏览器组件加载本地一个html页面,这个页面主要是展现一些边框、条幅,为的是跟C++开发的模块的风格看起来像,这个页面的主要内容是通过iframe调用别的web服务器的页面的。

今天一个模块的出问题了,经过定位,问题是这样的:iframe引入的页面设置了一个cookie,但后续的js请求数据时却没有发送这个cookie,而服务器会检查这个cookie,所以验证失败,在客户端表现为没响应。

问题缘由

IE6/IE7支持的P3P(Platform for Privacy Preferences Project (P3P) specification) 协议默认阻止第三方无隐私安全声明的cookie。

在默认情况下IE会自动禁用第三方站点(不同域的站点)的cookie, 也就是在请求第三方站点的某url时在HTTP header里不发送它们的cookie。

在这个客户端产品里,浏览器组件首先加载的是本地的html页面,然后用iframe加载web服务器的一个页面,那么web服务器的页面所在的域与于本地的页面所在的域是不同的,就存在跨域了,所以浏览器组件阻止发送cookie。

解决方法

一个简单的解决方法是设置 p3p 头,让浏览器(特别是IE)允许第三方cookie。由第三方服务器设置。

在jsp里面可以这样设置: response.setHeader("P3P","CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"")

P3P

P3P 是Platform for Privacy Preferences的简称,目的是创建一个标准的、机器可读的隐私策略框架。

P3P设计允许web站点传递自动的隐私声明,让用户浏览器有可能检查声明,并在合适的时候基于这些实践自动决定(是否接受cookie)。

设置P3P头的两种方式

  1. 设置PolicyRef头,如:P3P: policyref="http://catalog.example.com/P3P/PolicyReferences.xml"

  2. 紧凑的策略,如: P3P: "CP=IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT" ,各个策略用空格分开。

具体的策略设置语法如下:

compact-policy-field  = `CP="` compact-policy `"`

compact-policy        = compact-token *(" " compact-token) 

compact-token         = compact-access           |
                        compact-disputes         |
                        compact-remedies         |
                        compact-non-identifiable |
                        compact-purpose          |
                        compact-recipient        |
                        compact-retention        |
                        compact-categories       |
                        compact-test 

compact-access        = "NOI" | "ALL" | "CAO" | "IDC" | "OTI" | "NON"

compact-disputes      = "DSP" 

compact-remedies      = "COR" | "MON" | "LAW"

compact-non-identifiable = "NID" 

compact-purpose       = "CUR"        | "ADM" [creq] | "DEV" [creq] | "TAI" [creq] | 
                        "PSA" [creq] | "PSD" [creq] | "IVA" [creq] | "IVD" [creq] | 
                        "CON" [creq] | "HIS" [creq] | "TEL" [creq] | "OTP" [creq]

creq                  = "a" | "i" | "o"

compact-recipient     = "OUR" | "DEL" [creq] | "SAM" [creq] | "UNR" [creq] | 
                        "PUB" [creq] | "OTR" [creq]

compact-retention     = "NOR" | "STP" | "LEG" | "BUS" | "IND"

compact-category      = "PHY" | "ONL" | "UNI" | "PUR" | "FIN" | "COM" | 
                        "NAV" | "INT" | "DEM" | "CNT" | "STA" | "POL" | 
                        "HEA" | "PRE" | "LOC" | "GOV" | "OTC"

compact-test          = "TST"

参考链接

http://www.w3.org/2002/04/P3Pv1-header.html


欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据