IE7、IE8选项卡共用一个session的解决方案

本文介绍了一个关于IE7浏览器中出现的会话劫持问题及其解决方案。当两个用户在同一浏览器的不同选项卡中登录同一网站时,由于IE7共享会话导致用户A的信息被用户B覆盖。通过在URL中手动传递会话标识符(SID)的方法,成功避免了这一问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:
首先,有个网站登录用到了session;
然后,有一台电脑——————

用户A打开了IE7,登录网站,顺利登录;
接着,用户B在IE7上点开了一个新的选项卡,输入网址,登录网站,顺利登录;

这个时候!用户A按F5刷新!————会发现用户A的个人信息(假设是session变量存储的)变成了B的!!!这就是IE7、IE8的“选项卡”概念的毛病!所有选项卡只会打开一个IE进程,也就是:共用一个SESSION !


百度、google搜索答案~~~~说什么的都有,貌似根本没有解决问题(或者解决了也懒得说了)。

琢磨,测试。
经研究,参考了腾讯邮箱的搞法(url传SID!),成功解决,
---------------------------------------------------------------------
基本概念
session,中文翻译过来叫“会话”。
会话控制,在客户端保存一个唯一的会话标识符(即SID,默认名PHPSESSID),在服务器端,存储着该会话的数据(比如姓名、性别呀。。。等等)。我们要做的事就是:拿着这个会话标识符(SID),给服务器端,跟他讲:诺!这是我的卡!把我的东西都取出来!
---------------------------------------------------------------------

手册~~~~~~~

传递会话 ID

有两种方法传递一个会话 ID:

  • cookie
  • URL 参数

原理
(1)手工生成SID并用url传递他到下一页;(为什么要手工?手工等于我强制他每次生成SID都不一样啊,而自动生成的话,会先看cookie,有,就读原来的;没有,生成新的。)
(2)读取传递过来的SID对应的session数据。

会话的安全性
这里先不考虑这个。其实也简单,无非就是url传参时加密啊,还有,启动会话的时候,在会话数据中放一个变量,然后随时检查有没有这个变量啊~~~~~这个变量表示会话是用户创建的——会话数据中没有这个变量,那就说明会话ID是假的!
简单例子如下:

<?
define('ua_seed','domain.com');
session_start();
if(!isset($_SESSION['check'])){
 $_SESSION['check'] = md5($_SERVER['HTTP_USER_AGENT'].ua_seed);
}
else{
 if($_SESSION['check'] != md5($_SERVER['HTTP_USER_AGENT'].ua_seed)){
  exit('你是来搞破坏的~~~');
 }
}
?>

 

 

 

具体方法
假设有2个页面:index.phppage2.php


index.php代码:
<?php
//手工生成SID
$sid = md5(uniqid(rand()));//先搞个唯一的32位随机数
session_id($sid);//设置SID   关键!!!

 

//注意:session_id()和session_start()都会先检查有没有SID,没有,就生成一个新的!但是!session_id是放在session_start()之前的(不理解可详查手册)!你放在session_start()之后,貌似也不会报错,但是session_start()会先生成一个空的————临时文件去看就知道了!
/*系统临时文件夹找到这个 Session 文件,一般文件名形如:sess_4c83638b3b0dbf65583181c2f89168ec,后面是 32 位编码后的随机字符串。用编辑器打开它,看一下它的内容:

  admin|N;

  一般该内容是这样的结构:

  变量名|类型:长度:值;

  并用分号隔开每个变量。有些是可以省略的,比如长度和类型。
*/

 

 

session_start();
//session_regenerate_id();//这个函数是能再生成新的,但是必须放在session_start()之后,由于session_start()会生成空白的session文件,所以我弃之不用。

 

$_SESSION['username'] = rand();//这里搞个随机数,模拟下不同的登录用户名

 

$url="page2.php?sid=".$sid;//GET方式传递SID
header("refresh:0;url=".$url);//2秒钟后转向
?>

 

 

 

page2.php代码:
<?php
session_id($_GET['sid']);//关键!读取指定SID的东西!


session_start();

 

echo $_SESSION['username'];
?>



OK,现在登录吧,A登录了,好,A去尿尿了;B点开一个选项卡,也登录;A尿完回来了,按F5刷新~~~~不会变了。
搞定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值