主页 >> PHP > Cookie跨域之P3P解决方案

2013/05/27 | 星期一 分类:PHP | 没有评论 标签: , | 作者: | 1,906 views

Cookie跨域之P3P解决方案

Cookie跨域(第三方cookie)接收限制问题:本文是基于cookie保存session id 引出的问题,涉及浏览器的第三方cookie限制,这个在IE8、IE9才出现的问题。

情景:处理一个 js 跨域问题,使用 jsonp 跨域提交用户名密码请求,实现自动登录第三方网站,即 SSO(single-sign-on) 单点登录,一处登录处处登录。在 Chrome 下没问题,IE 却不行。查看 HTTP 的几个来回,发现登录请求是成功的,问题出在第三方网站返回的 cookie (session id) IE 并没有接受,下一次发送请求时根本没有带上 cookie,说明之前的 Set-Cookie 指令没有效果,所以怎么也登录不了。查了一下,有人使用 iframe 内嵌网页的形式,也遇到了 IE 下不能设置 cookie 的情况。

如果在“Internet选项”中把“隐私”级别设置为低,或者把第三方域名列入“可信站点”就没问题了。但是我们不可能让每个用户去更改 IE 设定吧?因此否决此观点…这是一个很常遇到的场景,肯定有别的解决办法。.

简单的说是“你访问域名A却接收到域名B的cookie 设定指令”这可能是由于网页A请求或链接了B的网页,比如 iframe 以及 jsonp问题。

相关概念:Session 默认都是基于 Cookie;PHP中的session在默认情况下是使用客户端的Cookie来保存session id的,所以当客户端的cookie出现问题的时候就会影响session了。
必须注意的是:session不一定必须依赖cookie,这也是 session相比cookie的高明之处。
当客户端的Cookie被禁用或出现问题时,PHP会自动把session id附着在URL中,这样再通过session id就能跨页使用session变量了。但这种附着也是有一定条件的,即“php.ini中session.use_trans_sid = 1或者编译时打开打开了–enable-trans-sid选项”.

Session非基于Cookie的情况:可以手动通过URL传值、隐藏表单传递session id,然后通过这个session id 获取session。

再看下另外一个概念:P3P,说明是P3P?
P3P 全称 Platform for Privacy Preferences,隐私设定平台规范。简言之,就是网站向浏览器声明自己的隐私政策,比如网站是否搜集访问者的个人信息,设置 cookie 的用途等等。浏览器会依据设置,决定在第三方请求的条件下是否接受网站的 cookie。这个规范极其复杂,跳过,请另查阅相关资料。

了解了情景与相关概念后:使用P3P规范让IE跨域接受第三方cookie 既可以解决问题。

至于完整地部署 P3P 包括设立隐私政策文件(policy.html)、原则档(policy.xml)、参考档(p3p.xml),非本文研究,可另查相关资料。

三种常用语言解决方案:发送头文件即可。 注意前面“#”注释

看了header,比如 IDC DSP 什么的是啥意思啊?

这些标签就是 P3P 所规定的了,例如 NOI 表示不搜集可识别用户的资料,ADM 表示信息搜集会用于网站管理……查看完整清单,中文简要清单。

浏览器会根据这些标签决定是否接受 cookie,根据测试结果,加上 NOI 最省事,一个就够了。不过网站一般很难做到 NOI,除非永远匿名,“登录”功能可能就违背了NOI。理论上讲,标签应该真实地反映网站的信息搜集行为,若声明的隐私政策与实际行为不符,是会要负法律责任的。Stackoverflow 有篇讨论提出了法律相关议题,可以参考。.

除了传送 P3P http header,还可以通过 HTML meta 标签,或者设定IIS服务器来声明P3P。

看完,文章也就解决了。

  • 本文目前尚无任何评论.
    1. 本文目前尚无任何 trackbacks 和 pingbacks.