P3P协议详解
P3P(Platform for Privacy Preferences)是W3C公布的一项隐私保护推荐标准,以为用户提供隐私保护。 P3P标准的构想是:Web 站点的隐私策略应该告之访问者该站点所收集的信息类型、信息将提供给哪些人、信息将被保留多少时间及其使用信息的方式,如站点应做诸如 “本网站将监测您所访问的页面以提高站点的使用率”或“本网站将尽可能为您提供更合适的广告”等申明。访问支持P3P网站的用户有权查看站点隐私报告,然后决定是否接受cookie 或是否使用该网站。
有别于JS跨域、IFRAME跨域等的常用处理办法,通过发送P3P头信息而实现的跨域。
# 原理
P3P协议可以完成cookie的跨域设置,例如在A域下请求B域的某个方法,B域上加载此协议后可以实现通过A域的请求完成cookie设置,当然此cookie的域肯定是B域的。说的简单些就是A域的cookie只能是在A域下设置,再怎样也做不到在A域下设置一个B域的cookie,但可以通过A域向B域发送一个跨域请求,B域响应此请求,虽然此请求来至A域,在某些情况下(IE大法)依旧无法完成cookie的设置,但在P3P协议的帮助下,即B域上运行着P3P协议,就可以完美的接收来至任何他域的请求来设置cookie了(再次强调,B域的cookie只能在B域下设置,若A域下就能设置B域的cookie先不说SOP协议当然无存,还没事折腾什么跨域)。
PHP 使用P3P协议
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
JS使用P3P协议
xmlhttp.setRequestHeader( "P3P" , 'CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"' );
# 实现案例
www.b.com/set_cookie.php 在b域名下设置a域名的cookie:
<script src="http://www.a.com/set_cookie.php"></script>
www.a.com/get_cookie.php 在a域名下获取cookie:
print_r($_COOKIE);
www.a.com/set_cookie.php 在a域名下设置a域名的cookie:
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
setcookie("test", "test value", time()+3600, "/");
2
访问www.b.com/set_cookie.php,然后访问www.a.com/get_cookie.php就可以获取cookie
其实,在chrome不用P3P头也可以获取到cookie,但是IE不行,加上P3P头,IE也可以了。