今天因工做須要,在一個域名A的頁面中,使用iframe包含另外一個域名B的頁面。在chrome,firefox測試一切正常。javascript
當測試到IE7時,發現域名B中的頁面session失效,不能寫入session。
php
網上搜索後瞭解, 由於IE有安全策略,限制頁面不保存第三方cookie(當前訪問域名A下的頁面爲第一方cookie,而域名B下的頁面爲第三方cookie)。
html
雖然有安全策略限制,但咱們能夠引入P3P聲明容許第三方收集我的信息,使第三方cookie不被拒絕。
java
P3P:Platform for Privacy Preferences(隱私偏好平臺)是W3C公佈的一項隱私保護推薦標準,可以保護在線隱私權。使用Internet者能夠選擇在瀏覽網頁時,是否被第三方收集並利用本身的我的信息。若是一個站點不遵照P3P標準,它的Cookies將被自動拒絕。
chrome
在iframe的頁面頭加入如下語句便可解決session失效問題。
跨域
[php] view plain copy 瀏覽器
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
cookie
[html] view plain copy session
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title> domain A page </title>
</head>
<body>
<p>A Page</p>
<iframe src="http://b.com/index.php"></iframe>
</body>
</html>
b.com/index.php
[php] view plain copy
<?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));
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title> domain B page </title>
</head>
<body>
<p>B Page</p>
<?php
if(isset($_SESSION['code'])){
echo 'code:'.$_SESSION['code'];
}
?>
</body>
</html>
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] view plain copy
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title> domain A page </title>
</head>
<body>
<p>A Page</p>
<iframe src="http://b.com/index.php"></iframe>
</body>
</html>
b.com/index.php
[php] view plain copy
<?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 '<script type="text/javascript"> window.top.location="http://b.com/setSession.php"; </script>';
exit();
}
}
$_SESSION['code'] = md5(microtime(true));
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title> domain B page </title>
</head>
<body>
<p>B Page</p>
<?php
if(isset($_SESSION['code'])){
echo 'code:'.$_SESSION['code'];
}
?>
</body>
</html>
b.com/setSession.php
[php] view plain copy
<?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');
?>
源碼下載地址:點擊查看