使用P3P共享Cookie与Session小结
P3P是什么
P3P是一种被称为个人隐私安全平台项目(the Platform for Privacy Preferences)的标准,能够保护在线隐私权,使Internet冲浪者可以选择在浏览网页时,是否被第三方收集并利用自己的个人信息。如果一个站点不遵守P3P标准的话,那么有关它的Cookies将被自动拒绝,并且P3P还能够自动识破多种Cookies的嵌入方式。p3p是由全球资讯联盟网所开发的。来自百度
其实P3P并没有成为标准,只是一种规范,大家都在遵守这个规范来行事而已。
应用场景
1. 跨域共享 Cookie ;
2. 跨域共享 Session ;
演示 - 跨域共享Cookie
演示站点有两个:haoren.com为当前站点、huaidan.com为第三方站点。假设haoren.com站点下有一个P3P-Test.html,代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>P3P Test</title> </head> <body> <iframe src="http://huaidan.com/setCookie.php"></iframe> </body> </html>
可以看到里面的iframe指向了一个第三方站点huaidan.com的setCookie.php页,代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Set Cookie</title> </head> <body> <?php setcookie("UserName","JRoger"); ?> </body> </html>
代码的意思很简单就是设置一个名为UserName的Cookie。
然后在huaidan.com这个第三方站点下还有一个getCookie.php页面。代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Get Cookie</title> </head> <body> <?php $userName = $_COOKIE["UserName"]; echo($userName); ?> </body> </html>
意思就是获取一个名为UserName的Cookie并打印到页面上。
重点上演了:
我们访问 http://haoren.com/P3P-Test.html 后,再访问第三方站点的 http://huaidan.com/getCookie.php 发现没有获取到 Cookie。可是 IFrame 明明调用了http://huaidan.com/setCookie.php页面设置了Cookie。其实是因为 haoren.com 和 huaidan.com 代表的是两个域,它们的 Cookie 信息是不能共享的。这个时候我们用上 P3P 了。使用的时候很简单,在 setCookie.php 页面设置 Cookie 之前加上一段设置P3P的代码,完整代码如下:
<?php header('P3P:CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"'); setcookie("UserName","JRoger"); echo($_COOKIE["UserName"]); ?>
此步设置后。再按如上顺序访问一次发现 Cookie 设置成功了。
小结
这个问题也就是大家常说的"IFrame 跨域问题"。接下来可以想到 Session 跨域问题。其实道理是一样。