P3P规范小结

查阅Cookie的跨域访问时接触到了P3P规范。P3P全称是platform for privacy preferences。通过W3C官方的规范文档,简单了解了P3P规范的用途,翻译其中的部分章节如下:

P3P

0x1   Introduction

The platform for privacy preferences project (p3p)

P3P 使网站用一种标准的、易解析的形式来传递他们的隐私条款。P3P User Agents 允许用户在适当的时候知晓站点隐私策略(通过机器可读和人类可读的形式),并且基于这些策略自动化决策。因此用户不用逐个阅读他们所访问站点的隐私策略。
尽管P3P 提供了一个技术性机制,用来保证用户在公布他们个人信息前知晓隐私策略,它并没有提供一个确保站点遵守它们的策略的技术机制。实现该规范的产品有可能在这方面提供了辅助功能,但是那是该规范之外的特定实现。P3P是法律和提供执行机制的自律程序的一个补充。另外,P3P不包括数据传输、保护个人数据传输及存储过程中安全性的机制。P3P可能被构建于那些用来促进数据传输的工具,这些工具应该包括适当的安全保护。

0x1.1 the P3P 1.0 specification

P3P 1.0规范定义了P3P隐私策略的语法和语义,以及策略与Web资源的关联机制。P3P策略包含了表达隐私策略的语句,该语句使用P3P词表构造。P3P策略也引用了P3P base data schema(所有P3P user agents都需支持的一个标准的数据元素集合。)中的元素。P3P规范包括一种定义新数据元素和数据集的机制,以及一种允许扩展P3P词表的简单机制。

0x1.1.4 P3P User agents

P3P 1.0 User Agents 可以内建与Web浏览器,浏览器插件或者代理服务器。它们也可以用java applets或者js来实现,或者内建与电子钱包,表单自动填充,或者其他用户数据管理工具。P3P User Agents 在公认的位置查找P3P策略的引用,如:在HTTP响应的P3P头中,在嵌入HTML内容的P3P link标签中。

这些引用指出了相关P3P策略的存储位置,User Agents可以从该位置获取策略,并解析、显示图形、发出声音等用户提示来反映出该站点的隐私条款。它们还可以将P3P策略和用户设定的隐私偏好进行比较并做出适当的操作。P3P可以为数据传输机制提供一系列的’门卫’功能,比如:电子钱包和表单自动填充。一个集成这些机制之一的P3P User Agent会检索P3P策略,将其与用户偏好比较,然后仅当以下情况都满足时,才授权数据的发布:

a/策略与用户偏好一致。

b/请求的数据传输与策略一致。

如果有一条不符,则用户应该被告知不符,并且可以自己决定是否允许该数据的传输。

P3P 1.0规范对与P3P User Agents的UI要求不多,因此User Agent 实现者可以各自决定显示给用户的Web站点隐私策略相关信息中的措词和符号。实现者不必在UI中逐字逐句的使用该规范中的定义。然而,他们要确保提供给用户的信息精确的符合P3P策略所描述的内容。

0x2 Referencing Policies

(建议将P3P文件放在公认的位置 /w3c/p3p.xml,下面是指定P3P策略文件位置的两种方法。)
0x2.2.2 HTTP Headers

任何通过HTTP检索的文档可以通过使用新的Response Header(P3P头)来指向一个策略引用文件。如果一个站点在使用P3P头,它应该将其包括在所有正常的请求方法内,包括HEAD和OPTIONS请求。

P3P头有一个或多个逗号分隔的指令。语法如下:

[1] p3p-header = `P3P: ` p3p-header-field *(`,` p3p-header-field)

[2] p3p-header-field = policy-ref-field | compact-policy-field | extension-field

[3] policy-ref-field = `policyref=”` URI-reference `”`

[4] extension-field = token[`=` (token | quoted-string) ]

为了与HTTP头规则保持一致,P3P头的名称可以被写成各种包装形式。内容必须使用本文档详述的包装来精确指定。policyref指令使用一个URI来指定策略引用文件的地址,它可能引用P3P策略并覆盖指向策略文件的文档,或者其他文档。当policyref是一个相对URI时,该相对URI会被相对于请求URI来解析。注意,获取policyref指令中的URI地址可能得到一个300类HTTP返回码(重定向类)。User Agents必须以一般情况的HTTP语义来解析这些重定向。policyref URI只能用来指定和引用P3P策略的地址!

compact-policy-field用来指定compcat policies。

User Agents发现无法识别的指令(extensions field中的内容)后必须忽略它。这些内容是为了使新版本的P3P更易于部署。

例如:

HTTP/1.1 200 OK
P3P: policyref=”http://catalog.example.com/P3P/PolicyReferences.xml”
Content-Type: text/html
Content-Length: 7413
Server: CC-Galaxy/1.3.18

0x2.2.3 HTML link TAG

服务器可能通过嵌套的link标签来对HTML内容提供服务,这些标签指示了相关P3P策略引用文件的地址。这种P3P的使用不要求服务器做出任何行为上的改变。

link标签将可以通过P3P头来传输的策略引用信息进行编码。link标签采用以下形式(这里只用了一种可能的ABNF格式):

P3P-LINK-TAG = <LINK REL=”P3Pv1″ HREF=”‘urI'”>

当href属性是一个相对URI,它被相对于请求URI来解析。

为了举例说明一下link标签的使用,我们考虑到之前的通过HTTP头传递的策略引用的例子。那个例子可以等同于以下的HTML片段:

<link rel=”P3Pv1″ href=”http://catalog.example.com/P3P/PolicyReferences.xml”>

最后,注意到自从P3P-LINK-TAG被嵌入HTML文档,它的编码会与HTML文档一致。与P3P策略和策略引用文档(章节2.3和3会讨论)相比,P3P-LINK-TAG不应该使用UTF-8编码。并且注意,link标签大小写不敏感。


0x4 Compact Policies

简洁策略,本质上就是P3P策略的一个摘要.它给User Agents提供信息,使其可以用做出迅速、同步的决策来应用策略。 简洁策略是User Agents或服务器的一个性能优化选项。

User Agents不能通过简洁策略获得做出决定的足够信息时,应该去获得完整策略。

在P3P中,简洁策略只包含了cookie相关的策略信息。Web服务器负责构建一个简洁策略来代表完整策略中引用的cookie。P3P简洁策略中指定的策略应用于同一个http response中设置的所有cookie的数据存储,该HTTP response相关脚本所设置的cookies,以及cookies所链接的数据。

0x4.1 Referencing compact policies

任何http资源都可以在P3P响应头中包含一个P3P简洁策略。如果一个站点使用P3P头,它应该将其包括在所有正常的请求方法中,包括HEAD 和options方法。

P3P简洁策略头有一个可能包含一个或多个有限标记符号的引用字符串。标记符号可以以任意顺序表示,空格是唯一合法的限定符。头的语法如下:

[50] compact-policy-field = `CP=”` compact-policy `”`

[51] compact-policy = compact-token *(” ” compact-token)

[52]

compact-token

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

对于所有HTTP头,P3P头域的名字是大小写不敏感的,但是值是大小写敏感的。如果一个HTTP响应包含不止一个简洁策略。P3Puser agents必须忽略首个之后的其他策略。

0x4.2 Compact Policy Vocabulary

P3P简洁策略使用标记符号代表以下P3P词表内的元素:ACCESS,CATEGORIES,DISPUTES,NON-IDENTIFIABLE,PURPOSE,RECIPENT,REMEDIES,RETENTION,TEST.

在一个简洁策略中,多次出现相同的标志符号等同于只出现以此,无法识别的标志符号等同于未出现。

访问跨域Cookie时常用到P3P简洁策略:
response().addHeader(“P3P”, “CP=/”IDC DSP COR CURa ADMa OUR IND PHY ONL COM STA/””);
但是浏览器对P3P的支持都不是很好,只有IE提供支持,Chrome提供部分支持。

 

References:

http://www.w3.org/TR/P3P/
http://blog.csdn.net/ghj1976/article/details/4889219

Leave a comment

Your email address will not be published. Required fields are marked *