PHP学习练手(十四)

本文详细介绍了PHP中的会话管理机制,包括会话与cookie的区别、如何设置与访问会话变量、垃圾收集机制以及如何提高会话的安全性。

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


SESSION会话


会话(session)

会话假定数据存储在服务器上,而不是浏览器中,会话标识符用于定位特定用户的记录(会话数据)。这个会话标识符通常通过cookie存储在用户的浏览器中,但是,敏感数据本身(如用户ID,姓名等)总是保留在服务器上。

会话与cookie的优缺点:

会话优点:
1. 一般更安全(因为数据保存在服务器上)
2. 允许存储更多数据
3. 使用会话时,可以不使用cookie

cookie优点:
1. 更容易编程
2. 需要更少的服务器资源
3. 通常情况下能够持续更长时间

设置会话:
1、在使用它们的每个页面都必须首先调用session_start()函数。这个函数告诉PHP开启一个新会话,或者访问一个现有的会话。必须在把任何内容发送到Web浏览器之前调用这个函数。

2、第一次使用session_start()函数时,它会试图发送一个cookie,名称为PHPSESSID(会话名称)和一个ID值(32个16进制字母)。由于试图发送一个cookie,所以在把任何数据发送到web浏览器之前,就必须先调用这个session_start()函数。

开启会话:
1、login.php 替换掉setcookie()相关:

。。。
//setcookie('user_id', $data['user_id'], time()+30, '/', '', 0, 0);

            //setcookie('first_name', $data['first_name'],time()+30, '/', '', 0, 0);

            session_start();

            //echo session_id();
            $_SESSION['user_id'] = $data['user_id'];
            $_SESSION['first_name'] = $data['first_name'];
。。。

注:
1、在php.ini中将session_auto_start设置为1,从而不必在每个页面上使用session_start()。但缺点是加大服务器开销。

2、可以在会话中存储数组。

访问会话变量:
1、loggedin.php修改$_COOKIE相关

session_start();
    //if(!isset($_COOKIE['user_id']))
    if(!isset($_SESSION['user_id']))
。。。
。。。
/*echo "<h1>Logged In</h1>
                    <p>You are now logged in, {$_COOKIE['first_name']}</p>
                    <p><a href=\"logout.php\">Logout</a></p>";*/

    echo "<h1>Logged In</h1>
                    <p>You are now logged in, {$_SESSION['first_name']}</p>
                    <p><a href=\"logout.php\">Logout</a></p>";

2、header.html修改$_COOKIE相关

/*if((isset($_COOKIE['user_id'])) && (basename($_SERVER['PHP_SELF']) != 'logout.php'))*/
                    if(isset($_SESSION['user_id']))

注:
1、session_start()函数允许当前脚本访问以前启动的会话(如果它可以读取cookie中存储的PHPSESSID值)或者创建一个新的会话(如果它不能读取这个值)。当找不到当前会话ID或者生成了新的会话ID,那么旧会话ID下存储的所有数据都将可不用

会话的垃圾收集

——是指删除会话文件(其中存储了实际的数据)的过程。创建一个销毁会话的注销系统是理想的,但是,并不能保证所有用户都按应该做的那样正式注销。所以PHP包含了一个清理进程。
无论何时调用session_start(), 都会引入PHP的垃圾分类集。用于检查每个会话最近的修改日期(每当设置或获取变量时都会修改会话)。有2个设置规定了垃圾收集:session_gc_maxlifetime和session.gc_probability。第一个设置用于指定在一个会话持续多少秒不活动之后,可将其看作空闲会话,从而删除。第二个设置确定执行垃圾收集的概率,其取值范围是1~100。默认设置是对每个session_start()都有1%的机会调用垃圾收集。如果PHP没有启动清理进程,则会删除任何超过1440秒未使用的会话。

删除会话变量:
1、单独删除一个会话变量:unset($_SESSION['var'])

2、删除每个会话变量$_SESSION = array()

3、从服务器中删除所有的会话数据session_destroy()

4、logout.php修改

//setcookie('user_id', '', time()-3600, '/', '', 0, 0);
//setcookie('first_name', '', time()-3600, '/', '', 0, 0);
$_SESSION = array();   //删除所有的会话变量
session_destroy();      //删除会话
//删除由session_start()创建的cookie
setcookie('PHPSESSID', '', time()-3600, '/', '', 0, 0);
。。。
。。。
/*echo "<h1>Logged Out!</h1>
                <p>You are now logged out, {$_COOKIE['first_name']}!</p>";*/

echo "<h1>Logged Out!</h1>
    p>You are now logged out!</p>";

注:删除会话的所有痕迹:

第一步:删除所有会话变量:$_SESSION = array();
第二步:删除会话:session_destroy();
第三步:删除会话建立的cookie:setcookie(‘PHPSESSID’, ”, time()-3600, ‘/’, ”, 0, 0);

提高会话安全性:

会话劫持(sessionhijacking):(举例说明)如果我可以获悉另一个用户的会话ID,就可以轻松的欺骗服务器把它看做是我的会话ID。此时,我就有效地接管了原用户的整个会话,并且可以访问他们的数据。

防止劫持:
方法一:在会话中存储某种用户标识符,然后反复地复查这个值,HTTP_USER_AGENT(所用的浏览器和操作系统的组合)是针对此目的的一个可能选择。这会增加一层安全性,因为仅当我运行的浏览器和操作系统与另一位用户完全一致时,才能够劫持他的会话。$_SESSION['agent'] = md5( $_SERVER['HTTP_USER_AGENT'])

会话固定(会话攻击的一种):
一个不怀好意的用户指定了一个用户的会话ID,则该用户以这个固定的会话ID进入站点,并做任何事。然后,那个不怀好意的用户可以访问那个会话,因为他知道会话ID是什么。用户登录后通过更改会话ID来帮助防止这些类型的攻击。session_regenerate_id()正是用于执行该任务的,它提供一个新的会话ID来引用当前的会话数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值