iframe中跨域传递COOKIE

晕掉,IE真是超级破,这次一个大问题,客户用一个Iframe引用我们的投票页面,居然可以一直刷票。查了好久,后来发现原来是IE有个叫P3P(The Platform for Privacy Preferences)隐私参数选择平台,这样的一个超强的功能.

在frameset里面,也就是里面的frame是来自第三方站点(不同IP或不同域名),那么默认情况下IE会自动禁用这些站点的cookie,也就是在请求某url时在HTTP header里不发送它们的cookie,包括session的cookie。注意,这些站点在response里面设置的cookie还是会被发送到浏览器的。

但象IE 6.0和IE 7.0有个自己的标准.要支持P3P,IE 6的缺省隐私等级设置为”中”——即”阻止没有合同隐私策略的第三方cookie”。而在用户浏览a.php时 A.com写入的为第一方Cookie,其嵌入的iframe指向b.php.这时B.com写入的就为第三方Cookie了,所以它是被IE当在了大门外。

所以,每次当用户提交的cookie提交时,就挂掉了.因为传不到真实的服务器.

好了,不多讲了,直接讲解决方案.

PHP的程序

可以直接在网站中写入

  1. <?php
  2. header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"')
  3. ?>

这样就能接受第三方的Cookie啦。

lighttpd的服务器

  1. server.modules    = ("mod_setenv")
  2. setenv.add-response-header = ( "P3P" => "CP='CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR'")

apache的服务器

  1. <VirtualHost>
  2. Header set P3P 'CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"'
  3. </VirtualHost>

IIS的服务器
增加一个网站http头来解决问题;
管理工具——〉选择一个网站——〉属性——〉http头,增加一个http头
然后输入头名:P3P
输入头内容:CP=CAO PSA OUR

2 条评论 »

  1. Ulysses said,

    十月 13, 2008 at 9:53 上午

    學習了!

  2. Renyi said,

    十一月 16, 2008 at 1:43 上午

    谢谢了 正在找LIGHTTPD的P3P设置

RSS feed for comments on this post · TrackBack URL

留下评论