您的位置:首页 > 编程语言 > PHP开发

PHP学习练手(十四)

2016-01-09 20:42 459 查看

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来引用当前的会话数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: