1. 程式人生 > >iframe 跨域訪問session/cookie丟失問題解決方法

iframe 跨域訪問session/cookie丟失問題解決方法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

今天因工作需要,在一個域名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

<!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

<?phpheader('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

<!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

<?phpheader('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'];// 如果是safariif(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

<?phpheader('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');?>


原始碼下載地址:點選檢視





           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述