php 当前会话失效,php 会话控制(禁用cookie后session为什么会失效?)

首先说明一点:session不一定必须依赖cookie,只是php默认客户端sessionid基于cookie方式保存。

到此,我想你也应该了解了php默认的session客户端保存方式是基于cookie的,所以一旦客户端禁用Cookie,那么session跨页将会失效,不知道这么描述是否合适,通俗的说无状态的东西要变的有状态,只能两边都进行比对,如果用cookie方式保存的SessionID,客户端这边的比对条件就放到cookie里,所以客户端禁用cookie,session便也会随之失效。php的session客户端ID一般有两种保存方式:cookie和url方式。如果是cookie中保存session ID,就可以看到浏览器的cookie中有一个PHPSESID变量(可以通过firefox查看)。如果是URL传递的(建议使用隐藏表单传递),就可以看到形如:index.php?PHPSESID=ves0d7uvdsab9k6sig73mnn592的URL。

demo1.php

session_start();

$_SESSION[‘blog‘]=‘http://blog.jb51.net‘;

echo "test2";

?>

demo2.php

session_start();

echo ‘session值为‘.$_SESSION[‘blog‘];

?>

运行上面的代码,在客户端cookie正常情况下,我么可以在demo2.php中打印出$_SESSION[‘blog‘]的值为:http://blog.jb51.net。但是,现在如果你手动禁用客户端的cookie,再运行该实例,可能就得不到结果了。因为默认的客户端sessionid保存方式在跨页后,读取不到前一页的sessionid,当执行session_start();将又会产生一个session文件,与之对应产生相应的session id,用这个session id是取不出前面提到的第一个session文件中的变量的,因为这个session id不是打开它的“钥匙”。如果在session_start();之前加代码session_id($sessionid);将不产生新的session文件,直接读取与这个id对应的session文件。简单的说就是在前一页取得session id,然后想办法传递到下一页,在下一页的session_start();代码之前加代码session_id(传过来的sessionid);

demo.php

$sid = $_GET[‘sid‘];

if(!empty($sid)){

session_id($sid);

session_start();

}else{

session_start();

$sid = session_id();

}

?>

demo2.php

$sid = $_GET[‘sid‘];

if(!empty($sid)){

session_id($sid);

session_start();

}else{

session_start();

$sid = session_id();

}

$id = $_POST[‘id‘];

$key = ‘poll_‘.$id;

if($id!=‘‘){

echo $key = ‘poll‘.$id;

if(!empty($_SESSION[$key])){

$_SESSION[$key]=$_SESSION[$key] + 1;

}else{

$_SESSION[$key]=1;

setcookie($key ,$id+1,time()+3600*24);

}

echo ‘‘;

}else{

echo ‘‘;

}

?>

除此之外,我们还可以将客户端PHPSESID存放到文件中,如:

demo.php

session_start();

$_SESSION[‘blogdomain‘]= ‘http://blog.jb51.net‘;

$sid=session_id();

$fp=fopen("D:\tmp\websid.txt","w+");

fwrite($fp,$sid);

fclose($fp);

echo ‘demo2‘;

demo2.php

$fp=fopen("D:\tmp\websid.txt","r");

$sid=fread($fp,1024);

fclose($fp);

session_id($sid);

session_start();

print_r($_SESSION);

当客户端禁用cookie,可以通过以下几种方式改变session对客户端cookie的依赖,使session抛开客户端cookie:

设置php.ini中的session.use_trans_sid = 1或者编译时打开了--enable-trans-sid选项,让PHP自动跨页传递session id。当session.use_trans_sid为有效时,session.use_only_cookies一定要设置为无效0。

手动通过URL传值、隐藏表单传递session id。

用文件、数据库等形式保存session_id,在跨页过程中手动调用。

改变session客户端ID保存方式:

session.use_cookies //控制客户端保存SessionID时使用哪一种方式,当它为“1”时,就说明启动了session cookie(初始值为1)

可以使用上面我们提到的函数来查询得到目前的session id:echo $_COOKIE["PHPSESSID"];

但是,如果client的浏览器不支持cookie的话,即使session.use_cookies这个参数的值等于“1”,用上述的查询也只会得到null。

php.ini中两个和该选项相关的配置参数:

session.use_cookies = 1  //是否使用cookies(默认值为1)

session.use_only_cookies=1  //为1时只使用cookie;为0时可使用cookie和其它方式,这时如果客户端cookie可用,则session还是默认用cookie(默认值为1)

注意:如果客户的浏览器是支持cookie的,强烈推荐“session.use_only_cookies = 1”,当session.use_only_cookies为有效时,即使想通过URL来传递session id也会被认为无效,这样可以减少通过sessionid被攻击的可能性。

在php代码页面中设置方式:

ini_set(‘session.use_cookies‘,‘1‘);

ini_set(‘session.use_only_cookies‘,‘1‘);

原文:http://www.cnblogs.com/lijiageng/p/6900413.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值