文档章节

iframe 跨域访问session/cookie丢失问题解决方法

 蜗牛奔跑
发布于 2016/02/16 10:58
字数 868
阅读 118
收藏 2

今天因工作需要,在一个域名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失效问题。

[php] view plain copy 在CODE上查看代码片派生到我的代码片

  1. 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] view plain copy 在CODE上查看代码片派生到我的代码片

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

  2. <html>  

  3.  <head>  

  4.   <meta http-equiv="content-type" content="text/html;charset=utf-8">  

  5.   <title> domain A page </title>  

  6.  </head>  

  7.   

  8.  <body>  

  9.   <p>A Page</p>  

  10.   <iframe src="http://b.com/index.php"></iframe>  

  11.  </body>  

  12. </html>  


b.com/index.php

[php] view plain copy 在CODE上查看代码片派生到我的代码片

  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. session_start();  

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

  5. ?>  

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

  7. <html>  

  8.  <head>  

  9.   <meta http-equiv="content-type" content="text/html;charset=utf-8">  

  10.   <title> domain B page </title>  

  11.  </head>  

  12.   

  13.  <body>  

  14.   <p>B Page</p>  

  15.   <?php  

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

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

  18.   }  

  19.   ?>  

  20.  </body>  

  21. </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 在CODE上查看代码片派生到我的代码片

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

  2. <html>  

  3.  <head>  

  4.   <meta http-equiv="content-type" content="text/html;charset=utf-8">  

  5.   <title> domain A page </title>  

  6.  </head>  

  7.   

  8.  <body>  

  9.   <p>A Page</p>  

  10.   <iframe src="http://b.com/index.php"></iframe>  

  11.  </body>  

  12. </html>  


b.com/index.php

[php] view plain copy 在CODE上查看代码片派生到我的代码片

  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. session_start();  

  4.   

  5. $ua = $_SERVER['HTTP_USER_AGENT'];  

  6. // 如果是safari  

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

  8.     // 如果未设置第一方cookie  

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

  10.         echo '<script type="text/javascript"> window.top.location="http://b.com/setSession.php"; </script>';  

  11.         exit();  

  12.     }  

  13. }  

  14.   

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

  16. ?>  

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

  18. <html>  

  19.  <head>  

  20.   <meta http-equiv="content-type" content="text/html;charset=utf-8">  

  21.   <title> domain B page </title>  

  22.  </head>  

  23.   

  24.  <body>  

  25.   <p>B Page</p>  

  26.   <?php  

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

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

  29.   }  

  30.   ?>  

  31.  </body>  

  32. </html>  


b.com/setSession.php

[php] view plain copy 在CODE上查看代码片派生到我的代码片

  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. session_start();  

  4. $_SESSION['safari'] = 1;  

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

  6. ?>  



源码下载地址:点击查看



本文转载自:

粉丝 38
博文 615
码字总数 118352
作品 0
海淀
私信 提问
同一IP不同端口访问的站点iframe应用session丢失怎么办?

在网站群的建设中,各子站需要共享主站的footer等公共信息。同时主站的后台管理也集成了各子站的管理,采取的方式是使用iframe嵌入各站的页面。在本机开发环境中,没有出现任何的问题。但是一...

oecp
2011/04/12
213
0
CP="CAO PSA OUR" 用P3P header解决iframe跨域访问cookie

1、IE浏览器iframe跨域丢失Session问题 在开发中,我们经常会遇到使用Frame来工作,而且有时是为了跟其他网站集成,应用到多域的情况下,而Iframe是不能保存Session的因此,网上可以找到很多...

随智阔
2013/10/23
628
0
AJAX是什么? AJAX的交互模型(流程)?同步和异步的区别? AJAX跨域的解决办法?

ajax是异步的 JavaScript 和 XML。通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。 交互流程: 1-...

wangwenya
2014/09/07
2.9K
1
IE 中跨域访问session失效问题

问题描述: 情形一:有服务器A与B(A、B服务器不在同一域中),服务器A中的页面包含有iframe,需要加载B服务器中的数据(需要登录验证后的)。验证信息从iframe的src属性中传递给服务器B,当...

Lofo
2013/09/27
2.2K
0
WEB安全之CSRF&ClickJacking

一、CSRF CSRF的全名是Cross Site Request Forgery,即跨站点请求伪站。 1、浏览器的cookie策略 很多攻击者伪造的请求之所以能在在服务器验证通过,是因为用户的浏览器成功发送了cookie的缘故...

TsingCall
2017/09/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Andorid SQLite数据库开发基础教程(2)

Andorid SQLite数据库开发基础教程(2) 数据库生成方式 数据库的生成有两种方式,一种是使用数据库管理工具生成的数据库,我们将此类数据库称为预设数据库,另一种是使用代码生成的数据库。...

大学霸
33分钟前
3
0
YecPad 开源啦!: 基于C#的功能强大的可编辑记事本文本编辑软件

JY Lin 开源:YecPad : 基于C#的功能强大的可编辑记事本文本编辑软件 YecPad 是一款基于C#编程语言开发的功能强大的可编辑记事本文本编辑软件。 可以进行文本文件的打开、保存、删除及编辑功...

YDOOK
40分钟前
4
0
StringBuilder 与 StringBuffer 的区别

StringBuffer是线性安全的,支持并发操作,适合多线程。 StringBuilder线性不安全,不支持并发操作,适合单线程。 也就是说他们俩区别就在于支不支持并发操作,使用上基本上类似...

无名氏的程序员
42分钟前
4
0
js 找数组中的最值

本文转载于:专业的前端网站➸js 找数组中的最值 背景: 2个数组以下 , 比如 [[4, 9, 1, 3], [13, 35, 18, 26], [32, 35, 97, 39], [1000000, 1001, 857, 1]] 找最值的时候,我一开始想用两个...

前端老手
51分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部