文档章节

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

 蜗牛奔跑
发布于 2016/02/16 10:58
字数 868
阅读 46
收藏 1
点赞 1
评论 0

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



源码下载地址:点击查看



本文转载自:

共有 人打赏支持
粉丝 36
博文 596
码字总数 114025
作品 0
海淀
同一IP不同端口访问的站点iframe应用session丢失怎么办?

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

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

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

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

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

wangwenya
2014/09/07
0
1
使用 P3P 轨范让 IE 跨域接受第三方 cookie(转)

使用 P3P 规范让 IE 跨域接受第三方 cookie(转) 使用 P3P 规范让 IE 跨域接受第三方 cookie 原文:http://blog.csdn.net/cuihaiyang/article/details/8106651 前两天尝试使用 jsonp 跨域提交...

chenzy526
2017/05/19
0
0
WEB安全之CSRF&ClickJacking

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

TsingCall
2017/09/30
0
0
IE 中跨域访问session失效问题

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

Lofo
2013/09/27
0
0
Nginx负载均衡多个Tomcat,如何实现Cookie跨大域??

1. 最近使用 memcached-session 方案实现了多个tomcat共享session; 2. 使用Nginx 实现了多个tomcat部署一套系统进行负载均衡; 但是发现一个问题:Tomcat A 部署在 10.0.125.1 下, Tomcat...

山哥
2012/07/19
3.6K
4
浏览器同源策略及 Ajax 跨域解决方案

因为在开发过程中会经常遇到因为浏览器同源策略而导致的跨域问题,而多数开发者对浏览器同源策略和跨域问题并没有很清晰的认识,所以打算在这篇文章中说下浏览器同源策略和我们最经常会遇到的...

淘淘笙悦
07/13
0
0
Weblogic两个域 session冲突

转自:http://hi.baidu.com/576699909/blog/item/9d93db1fe0cdc2e01ad57659.html。 在将LWAP开发的应用迁移为Oracle ADF来开发的过程中,LWAP和ADF应用都部署在同一个Weblogic服务器的两个D...

叶落花开
2012/04/12
0
0
bboss 会话共享框架 4.0.8 发布

bboss 会话共享4.0.8发布 bboss 会话共享功能特点: 作 用:为应用提供统一会话管理功能,避免集群部署场景下负载切换session丢失问题; 跨域跨应用共享会话并实现SSO功能;解决了会话共享五...

bboss
2015/08/02
3.2K
16

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java8新特性之接口

在JDK8以前,我们定义接口类中,方法都是抽象的,并且不能存在静态方法。所有的方法命名规则基本上都是 public [返回类型] [方法名](参数params) throws [异常类型] {}。 JDK8为接口的定义带...

developlee的潇洒人生
41分钟前
0
0
aop + annotation 实现统一日志记录

aop + annotation 实现统一日志记录 在开发中,我们可能需要记录异常日志。由于异常比较分散,每个 service 方法都可能发生异常,如果我们都去做处理,会出现很多重复编码,也不好维护。这种...

长安一梦
52分钟前
2
0
将博客搬至CSDN

AHUSKY
今天
1
0
Python web框架Django学习(1)

1.Django简介 (1)Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。Django是一个开放源代码的Web应用框架,由Python写成。 (2...

十年磨一剑3344
今天
0
0
Databook-数据之书

Databook-数据之书 用于数据分析的Jupyter Notebooks。 不需购买服务器,快速开始自己的数据分析过程。 源码:https://github.com/openthings/databook 作者:openthings,https://github.co...

openthings
今天
5
0
Python PIPEs

https://www.python-course.eu/pipes.php https://www.tutorialspoint.com/python/os_pipe.htm

zungyiu
今天
1
0
gRPC学习笔记

gRPC编程流程 1. proto文件定义 proto文件用于定义需要通过gRPC生成的接口,可以理解为接口定义文档 2. 通过构建工具生成服务基类代码-Maven或Gradle 3. 服务端开发 服务端实现类须实现通过构...

OSC_fly
今天
0
0
Docker Mac (三) Dockerfile 及命令

Dockerfile 最近学习docker的时候,遇到一件怪事,关于docker镜像可能会被破坏,还不知道它会有此措施 所以需要了解构建Dockerfile的正确方法 Dockerfile是由一系列命令和参数构成的脚本,这些命...

___大侠
今天
0
0
Android Studio+NDK+Cmake 移植FFmpeg-4.0.2命令行工具

一、编译 参考大神的帖子,亲测一次编译成功:https://blog.csdn.net/bobcat_kay/article/details/80889398 鉴于以前查文档的经验,这里附上编写例子的时间:2018年7月22日 我用的是ubantu,...

她叫我小渝
今天
0
0
mysql创建数据库

登录MYSQL mysql -u root -p 脚本创建数据库WeChat,并制定默认的字符集是utf8mb4。 CREATE DATABASE Wechat DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci; 授权 grant all......

niithub
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部