2024年2月24日发(作者:)
使用P3P跨域传递cookie的原理及apache的解决方案
原理
目前,跨域调用,IE浏览器在级别为中的设定下是不传递cookie的,这是因为支持P3P的浏览器,例如IE6.0,其中一项功能就是依据用户的安全设置,拒绝cookie或给用户发出安全警告。IE 6的缺省隐私等级设置为“中”——即“阻止没有合同隐私策略的第三方cookie;阻止使用个人可标识信息而没有您的隐含许可的第三方cookie;限制使用个人可标识信息而没有隐含许可的第一方cookie”。
对于跨域调用的情况,第一方cookie即为联盟网站的cookie,而百度的cookie即为第三方cookie。因此,此时被安全级别为中的用户浏览器将百度的cookie阻止,而无法传递给百度。
为解决上述问题,需要生成百度cookie的同时添加合同隐私策略,即P3P(The
Platform for Privacy Preferences Project)。P3P标准的构想是:Web 站点的隐私策略应该告之访问者该站点所收集的信息类型、信息将提供给哪些人、信息将被保留多少时间及其使用信息的方式,如站点应做诸如 “本网站将监测您所访问的页面以提高站点的使用率”或“本网站将尽可能为您提供更合适的广告”等申明。访问支持P3P网站的用户有权查看站点隐私报告,然后决定是否接受cookie或是否使用该网站。
在添加合同隐私策略后,此时将百度的cookie为包含合同隐私策略的第三方cookie而保证在跨域调用时被传递。同时,为了和当前的cookie进行区别,在BAIDUID后增加flag字段。新的cookie生成方法将flag字段置为1,而老的cookie没有该字段。这样,升级后的apache可以通过flag字段是否存在来判断新老cookie。对于老cookie需要重新置位。
实现
通过调研,目前百度生成cookie的产品线有:贴吧,搜藏,空间,知道,新闻,mp3,和ps。其中,贴吧,搜藏,空间,知道,新闻使用apache种的mod_usertrack模块来实现对cookie的读写,mp3音乐盒使用js来设置cookie,而ps使用bwx。
对于apache,通过在mod_usertrack模块make_cookie的函数中的如下函数前
ap_table_setn(r->headers_out,(dcfg->style == CT_COOKIE2 ? "Set-Cookie2" :
"Set-Cookie"),new_cookie);
添加ap_table_setn(r->headers_out, "P3P", "CP=" OTI DSP COR IVA OUR IND COM
""); 即可。
对于bwx,其实现原理类似。
对于js调用,仍然可以通过js代码来添加头部。
实例
通过修改apache,实现跨域调用的实例
实验中有两个域,, :19200。其中,在中有两个页面。中嵌入一个iframe,
发布评论