php抓取iframe cookie,iframe 跨域访问session/cookie丢失问题解决方法

今天因工作需要,在一个域名A的页面中,使用iframe包含另一个域名B的页面。在chrome,firefox测试一切正常。

当测试到IE7时,发现域名B中的页面session失效,不能写入session。

网上搜索后了解, 因为IE有安全策略,限制页面不保存第三方cookie(当前访问域名A下的页面为第一方cookie,而域名B下的页面为第三方cookie)。

虽然有安全策略限制,但我们可以引入P3P声明允许第三方收集个人信息,使第三方cookie不被拒绝。

P3P:Platform for Privacy Preferences(隐私偏好平台)是W3C公布的一项隐私保护推荐标准,能够保护在线隐私权。使用Internet者可以选择在浏览网页时,是否被第三方收集并利用自己的个人信息。如果一个站点不遵守P3P标准,它的Cookies将被自动拒绝。

在iframe的页面头加入以下语句即可解决session失效问题。

header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');

a.com/index.php

HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

domain A page

A Page

b.com/index.php

header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');

session_start();

$_SESSION['code'] = md5(microtime(true));

?>

HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">

 domain B page 

B Page

if(isset($_SESSION['code'])){

echo'code:'.$_SESSION['code'];

}

?>

IE iframe 跨域访问session问题解决了,但测试后发现,即使加入了P3P,safari浏览器依然不能保存iframe页面中的session。

原来safari的安全策略是,当cookie并未以第一方cookie保存过的(非iframe),将判断为不安全而直接拒绝。因此与IE的P3P有些不同。

解决方法如下:

首先在iframe的页面中判断某个session值是否存在。如果不存在,使用js修改window.top.location跳到一个本域的setSession.php页面。

因为是用window.top.location打开,因此并非iframe去访问,且能以第一方cookie保存.

然后在setSession.php页面执行完set session后,会跳回A域名的页面。之后就能使用session而不失效了。

代码如下:

a.com/index.php

HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

domain A page

A Page

b.com/index.php

header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');

session_start();

$ua=$_SERVER['HTTP_USER_AGENT'];

// 如果是safari

if(strstr($ua,'Safari')!=''&&strstr($ua,'Chrome')==''){

// 如果未设置第一方cookie

if(!isset($_SESSION['safari'])){

echo'';

exit();

}

}

$_SESSION['code'] = md5(microtime(true));

?>

HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">

 domain B page 

B Page

if(isset($_SESSION['code'])){

echo'code:'.$_SESSION['code'];

}

?>

b.com/setSession.php

header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');

session_start();

$_SESSION['safari'] = 1;

header('location:http://a.com/index.php');

?>

源码下载地址:点击查看

你可能感兴趣的:(php抓取iframe,cookie)