Session变量不能转移到下页.解决: session.use_trans_sid = 1

附:文摘

============================================================

在PHP使用SESSION的朋友可能会碰到这么一个问题。SESSION变量不能跨页传递。这令我苦恼了好些日子,终于通过查资料思考并攻克了这个问题。我觉得。出现这个问题的解决办法有下面几点:

1、client禁用了cookie

2、浏览器出现故障,临时无法存取cookie

3、php.ini中的session.use_trans_sid = 0或者编译时没有打开--enable-trans-sid选项

为什么会这样呢?以下我解释一下:

Session储存于server端(默认以文件方式存储session),依据client提供的session id来得到用户的文件,取得变量的值,session id能够使用client的Cookie或者Http1.1协议的Query_String(就是訪问的URL的“?

”后面的部分)来传送给server,然后server读取Session的文件夹……。

也就是说,session id是取得存储在服务上的session变量的身份证。当代码session_start();执行的时候,就在server上产生了一个session文件。随之也产生了与之唯一相应的一个session
id,定义session变量以一定形式存储在刚才产生的session文件里。通过session id,能够取出定义的变量。跨页后,为了使用session,你必须又运行session_start();将又会产生一个session文件。与之相应产生相应的session id。用这个session id是取不出前面提到的第一个session文件里的变量的,由于这个session id不是打开它的“钥匙”。假设在session_start();之前加代码session_id($session id);将不产生新的session文件。直接读取与这个id相应的session文件。

PHP中的session在默认情况下是使用client的Cookie来保存session id的,所以当client的cookie出现故障的时候就会影响session了。必须注意的是:session不一定必须依赖cookie,这也是session相比cookie的高明之处。当client的Cookie被禁用或出现故障时,PHP会自己主动把session id附着在URL中,这样再通过session id就能跨页使用session变量了。但这样的附着也是有一定条件的。即“php.ini中的session.use_trans_sid
= 1或者编译时打开打开了--enable-trans-sid选项”。

用过论坛的朋友都知道,在进入论坛的时候,往往会提示你检查Cookie是否打开,这是由于大多数论坛都是基于Cookie的,论坛用它来保存username、password等用户信息,方便使用。并且非常多朋友都觉得Cookie不安全(事实上不是这样),往往禁用它。事实上在PHP程序中,我们全然能够用SESSION来取代Cookie,它能够不依赖于client是否开启Cookie。

所以。我们能够抛开cookie使用session,即假定用户关闭cookie的情况下使用session,事实上现途径有下面几种:

1、设置php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项,让PHP自己主动跨页传递session id。

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

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

途径1举例说明:

s1.php

<?

php

session_start();

$_SESSION[’var1’]="中华人民共和国";

$url="<a href=".""s2.php">下一页</a>";

echo $url;

?

>

s2.php

<?php

session_start();

echo "传递的session变量var1的值为:".$_SESSION[’var1’];

?>

执行以上代码,在clientcookie正常的情况下。应该能够在得到结果“中华人民共和国”。

如今你手动关闭client的cookie,再执行,可能得不到结果了吧。

假设得不到结果,再“设置php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项”,又得到结果“中华人民共和国”

途径2举例说明:

s1.php

<?php

session_start();

$_SESSION[’var1’]="中华人民共和国";

$sn = session_id();

$url="<a href=".""s2.php?

s=".$sn."">下一页</a>";

echo $url;

?

>

s2.php

<?php

session_id($_GET[’s’]);

session_start();

echo "传递的session变量var1的值为:".$_SESSION[’var1’];

?

>

隐藏表单的方法基本原理同上。

途径3举例说明:

login.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<title>Login</title>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

</head>

<body>

请登录:

<form name="login" method="post" action="mylogin1.php">

username:<input type="text" name="name"><br>

口 令:<input type="password" name="pass"><br>

<input type="submit" value="登录">

</form>

</body>

</html>

mylogin1.php

<?php

$name=$_POST[’name’];

$pass=$_POST[’pass’];

if(!$name || !$pass) {

echo "username或password为空。请<a href="login.html">又一次登录</a>";

die();

}

if (!($name=="youngong" && $pass=="123") {

echo "username或password不对,请<a href="login.html">又一次登录</a>";

die();

}

//注冊用户

ob_start();

session_start();

$_SESSION[’user’]= $name;

$psid=session_id();

$fp=fopen("e:/tmp/phpsid.txt","w+";

fwrite($fp,$psid);

fclose($fp);

//身份验证成功,进行相关操作

echo "已登录<br>";

echo "<a href="mylogin2.php">下一页</a>";

?>

mylogin2.php

<?

php

$fp=fopen("e:/tmp/phpsid.txt","r";

$sid=fread($fp,1024);

fclose($fp);

session_id($sid);

session_start();

if(isset($_SESSION[’user’]) && $_SESSION[’user’]="laogong" {

echo "已登录!";

}

else {

//成功登录进行相关操作

echo "未登录,无权訪问";

echo "请<a href="login.html">登录</a>后浏览";

die();

}

?>

相同请关闭cookie測试。username:youngong password:123 这是通过文件保存session id的,文件是:e: mpphpsid.txt,请依据自己的系统决定文件名称或路径。

至于用数据库的方法。我就不举样例了,与文件的方法类似。

总结一下,上面的方法有一个共同点,就是在前一页取得session id。然后想办法传递到下一页。在下一页的session_start();代码之前加代码session_id(传过来的session id);

====================================================================

还有,我的php.ini文件存放在两个地方 1.c:/php4/php.ini     2.c:/winnt/php.ini ,,而我的程序好像仅仅认识 c:/php4/php.ini,对于 winnt 下的php.ini 修改不起作用.!!!

在不清楚哪一个php.ini起作用的时候最好同一时候修改两个文项目,尽管麻烦,但解决这一问题.

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-10-28 22:21:44

Session变量不能转移到下页.解决: session.use_trans_sid = 1的相关文章

Session变量不能传送到下一页.解决: session.use_trans_sid = 1

在PHP中使用过SESSION的朋友可能会碰到这么一个问题,SESSION变量不能跨页传递.这令我苦恼了好些日子,最终通过查资料思考并解决了这个问题.我认为,出现这个问题的原因有以下几点: 1.客户端禁用了cookie 2.浏览器出现问题,暂时无法存取cookie 3.php.ini中的session.use_trans_sid = 0或者编译时没有打开--enable-trans-sid选项 为什么会这样呢?下面我解释一下: Session储存于服务器端(默认以文件方式存储session),根

PHP Session变量

PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置.Session 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的.开始 PHP Session把用户信息存储到 PHP session 中之前,首先必须启动会话.session_start() 函数必须位于 <html> 标签之前<?php session_start(); ?> 存储 Session 变量存储和取回 session 变量的正确方法是使用

dedecms SESSION变量覆盖导致SQL注入common.inc.php的解决方法

漏洞名称:dedecms SESSION变量覆盖导致SQL注入 补丁文件:/include/common.inc.php 补丁来源:阿里云云盾自研 漏洞描述:dedecms的/plus/advancedsearch.php中,直接从SESSION[SESSION[sqlhash]获取值作为$query带入SQL查询,这个漏洞的利用前提是session.auto_start = 1即开始了自动SESSION会话,云盾团队在dedemcs的变量注册入口进行了通用统一防御,禁止SESSION变量的传入

Centos7下Nginx+Tomcat配置反向代理,使用memcached解决session一致性问题

一.session一致性问题 使用集群方案解决网站高并发问题时,就会部署多台应用服务器.当用户第一次通过客户端(如:浏览器)访问服务器时,服务器会创建对应的session, 使用Nginx反向代理,假如用户A第一次访问站点,被反向代理到服务器一处理,服务器一创建对应sessionA记录信息,用户A再次访问站点时,被反向代理到服务二处理, 而服务器二没有记录用户A的session信息,就会新创建sessionB,导致用户A之前操作丢失. 我们可以通过让多个服务器统一到同一个地方新建session和

Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用

一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性,不得不说下Http协议.我们常常听到说,Http是一个无状态协议,同一个会话的连续两个请求互相不了解,他们由最新实例化的环境进行解析,除了应用本身可能已经存储在全局对象中的所有信息外,该环境不保存与会话有关的任何信息.之所以我们在使用ASP.NET WebForm开发中会感觉不到Http的无状态特

PHP超级全局变量——Session 变量

PHP session 变量用于存储有关用户会话的信息,或更改用户会话的设置.Session 变量保存的信息是单一用户的,并且可供应用程序中的所有页面使用. PHP Session 变量 当您运行一个应用程序时,您会打开它,做些更改,然后关闭它.这很像一次会话.计算机清楚你是谁.它知道你何时启动应用程序,并在何时终止.但是在因特网上,存在一个问题:服务器不知道你是谁以及你做什么,这是由于 HTTP 地址不能维持状态. 通过在服务器上存储用户信息以便随后使用(比如做分页设计的时候,把页面的信息存放

【转】 Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用

一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性,不得不说下Http协议.我们常常听到说,Http是一个无状态协议,同一个会话的连续两个请求互相不了解,他们由最新实例化的环境进行解析,除了应用本身可能已经存储在全局对象中的所有信息外,该环境不保存与会话有关的任何信息.之所以我们在使用ASP.NET WebForm开发中会感觉不到Http的无状态特

dedecms SESSION变量覆盖导致SQL注入漏洞修补方案

dedecms的/plus/advancedsearch.php中,直接从$_SESSION[$sqlhash]获取值作为$query带入SQL查询,这个漏洞的利用前提是session.auto_start = 1即开始了自动SESSION会话. 危害: 1.黑客可以通过此漏洞来重定义数据库连接. 2.通过此漏洞进行各种越权操作构造漏洞直接写入webshell后门. 云盾团队在dedemcs的变量注册入口进行了通用统一防御,禁止SESSION变量的传入,修复方法如下: 用文本编辑器打开/mnt/

[ASP.NET][Session] 使用会话管理解决 Session 丢失问题

使用会话管理解决 Session 丢失问题 步骤 1.在 CMD 中输入命令 cd C:\Windows\Microsoft.NET\Framework\v4.0.30319 再执行 语法:aspnet_regsql.exe -S 服务器ip -U 数据库登录名 -P 数据库密码 -d 所要放入的数据库 -ssadd -sstype c 实例:aspnet_regsql.exe -S localhost -U sa -P 123456 -d ZSZ -ssadd -sstype c 执行成功的结