关于Iframe如何跨域访问Cookie和Session的解决方法


Posted in PHP onApril 15, 2013

最近做登录系统的整合,其中遇到的一个最关键的问题为在一个统一的后台里需要无障碍的访问另外一个系统后台,这个系统是第三方提供的一个加过密的系统,后台自动登录接口是自己分析出来的,没有单独提供,当从统一后台通过自动登录接口登录时,系统直接跳转到系统后台首页,后台登录成功后所跳转的URL这里没法指定,控制不了跳转的页面,如果在统一后台里需要链接到这个系统后台的另外一个页面,而非后台默认首页时,也就是将第三方系统后台的菜单功能放到我们这个统一后台里。

对于这样的一个需要,这里会遇到一个问题,为了能正常访问第三方系统的后台栏目,必需确保已经登录该系统,否则会提示用户登录,所以在点击这些菜单链接时,系统必需已经登录。

为了解决这个问题,在页面头部添加了一个不可见的iframe,使其指向到自动登录接口,这个接口如果正常通过浏览器地址栏访问,当用户名和密码验证无误时,会跳转到系统后台首页,由于此时放在了一个不可见的IFRAME中,所以跳转对当前后台页面没有任何影响。按照我的设计方法,系统应该就可以正常使用了。

但,既然说到但了,就说明肯定遇到了问题,不然这里不会来这么大的一个转折的。

但由于这里各系统均属于不同的系统,域名不一样,所以出现了Iframe在IE中,不能正常生成第三方系统Cookie的情况,但在Firefox和其它浏览器中均可生成,所以用IE访问时,总是跳转到登录页面。

这里需要说明一下,这里的第三方系统放在我们自己的服务器上的,只是所有源码加了密!

最后查阅了相关资料后,发现在IE中,为了安全,阻止了通过IFRAME生成第三方域的COOKIE,为了解决这个问题,MS规定只要在HTTP的HEADER头中,设定P3P这个头,就可以通过IFRAME来生成第三方COOKIE了。

PHP中,P3P HEADER 头的设置方法如下:

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

注意:这里的P3P需要添加到第三方域生成Cookie的那个文件才生效,否则无济于事。

这里又有问题了,第三方系统生成COOKIE在后台的一个叫admin.php的页面里生成的,而这个页面又是加过密的,这可怎么办了,想了很久,最后同事灵机一动,说我们可以用我们自己的文件来包含它。靠,这方法太妙了,为什么我就没有想到了,同事真是太有才了,真是佩服的五体投地,当然,我对他这么一佩服,据他说自己当晚也自己佩服了自己一晚上。

所以最后的解决方案为将原来的admin.php文件命名为admin_2.php,然后新建admin.php,最后在这个文件中,添加上面所的P3P这个HEADER头,并再次包含 admin_2.php这个文件,最终代码如下:

header(‘P3P: CP=”CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR”‘);
include “admin_2.php”;

最后,问题彻底解决!

这里标题是COOKIE和SESSION的问题,实质上,基本上是一回事,SEESION最终的保存也是通过SESSION_ID保存到COOKIE源码天空,然后通过这个SID到服务器上找相应的SEESION数据,只要把COOKIE里的SEESION_ID这个COOKIE给删掉,SESSION也就失效了。

PHP 相关文章推荐
php 图像函数大举例(非原创)
Jun 20 PHP
PHP n个不重复的随机数生成代码
Jun 23 PHP
支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
Mar 13 PHP
PHP将HTML转换成文本的实现代码
Jan 21 PHP
PHP计算指定日期所在周的开始和结束日期的方法
Mar 24 PHP
PHP使用递归方式列出当前目录下所有文件的方法
Jun 02 PHP
PHP与Java对比学习日期时间函数
Jul 03 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
Jul 26 PHP
Laravel模型间关系设置分表的方法示例
Apr 21 PHP
ThinkPHP5.0多个文件上传后找不到临时文件的修改方法
Jul 30 PHP
Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解
Aug 02 PHP
确保Laravel网站不会被嵌入到其他站点中的方法
Oct 18 PHP
关于PHP的相似度计算函数:levenshtein的使用介绍
Apr 15 #PHP
关于PHP递归算法和应用方法介绍
Apr 15 #PHP
PHP 读取Postgresql中的数组
Apr 14 #PHP
php简单开启gzip压缩方法(zlib.output_compression)
Apr 13 #PHP
做了CDN获取用户真实IP的函数代码(PHP与Asp设置方式)
Apr 13 #PHP
php检测图片木马多进制编程实践
Apr 11 #PHP
谈谈关于php的优点与缺点
Apr 11 #PHP
You might like
Zend Guard一些常见问题解答
2008/09/11 PHP
php获取mysql数据库中的所有表名的代码
2011/04/23 PHP
php对数组排序代码分享
2014/02/24 PHP
异步加载技术实现当滚动条到最底部的瀑布流效果
2014/09/16 PHP
在Linux系统下一键重新安装WordPress的脚本示例
2015/06/30 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
如何解决PHP获取不到SESSION信息之一般情况
2019/10/10 PHP
laravel高级的Join语法详解以及使用Join多个条件
2019/10/16 PHP
jQuery Selector选择器小结
2010/05/06 Javascript
从零开始学习jQuery (三) 管理jQuery包装集
2011/02/23 Javascript
js之onload事件的一点使用心得
2013/08/14 Javascript
如何用jquery控制表格奇偶行及活动行颜色
2014/04/20 Javascript
jQuery插件实现适用于移动端的地址选择器
2016/02/18 Javascript
学习javascript文件加载优化
2016/02/19 Javascript
详解Bootstrap插件
2016/04/25 Javascript
jQuery实现自动输入email、时间和域名的方法
2016/08/24 Javascript
轻松掌握JavaScript单例模式
2016/08/25 Javascript
JS动态计算移动端rem的解决方案
2016/10/14 Javascript
JavaScrpt中如何使用 cookie 设置查看与删除功能
2017/07/09 Javascript
微信小程序scroll-view仿拼多多横向滑动滚动条
2020/04/21 Javascript
利用Vue-draggable组件实现Vue项目中表格内容的拖拽排序
2019/06/07 Javascript
vue 导航内容设置选中状态样式的例子
2019/11/01 Javascript
[01:00]选手抵达华西村 整装待发备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
利用Python的装饰器解决Bottle框架中用户验证问题
2015/04/24 Python
Python中 map()函数的用法详解
2018/07/10 Python
Python Selenium 之数据驱动测试的实现
2019/08/01 Python
python序列类型种类详解
2020/02/26 Python
Python爬虫爬取百度搜索内容代码实例
2020/06/05 Python
Python实例教程之检索输出月份日历表
2020/12/16 Python
详解纯CSS3制作的20种loading动效
2017/07/05 HTML / CSS
KEETSA环保床垫:更好的睡眠,更好的生活!
2016/11/24 全球购物
桥梁与隧道工程专业本科生求职信
2013/10/08 职场文书
给校长的建议书
2014/03/12 职场文书
大学体育课感想
2015/08/10 职场文书
python geopandas读取、创建shapefile文件的方法
2021/06/29 Python
24年收藏2000多部退役军用电台
2022/02/18 无线电