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来引用当前的会话数据。
相关文章推荐
- 在 NetBeans IDE 中调试 PHP 源代码
- 14ava语法回顾之inputsteam&&outputsteam
- php 实现 二维码 扫描登录
- php 实现 二维码 扫描登录
- 【PHP进阶篇】2.函数--慕课网【学习总结】
- yaf学习资料
- ubuntu下安装phpstudy环境记录
- PHP的循环语句loop大家都知道吗
- PHP做While循环教程
- 【PHP进阶篇】1.数组--慕课网【学习总结】
- 使用php+swoole对client数据实时更新(下)
- 【PHP入门篇】 8.PHP开发工具之Zend Studio常用功能--慕课网【学习总结】
- PHP常用字符串操作函数实例总结(trim、nl2br、addcslashes、uudecode、md5等)
- 【PHP入门篇】 7.PHP开发工具之Zend Studio快捷键--慕课网【学习总结】
- PHP统计目录中文件以及目录中目录大小的方法
- PHP学习练手(十三)
- PHP数组相加和merge的区别
- php class类的用法详细总结
- 实践中的importPoint
- PHP表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法