CodeIgniter配置之SESSION用法实例分析


Posted in PHP onJanuary 19, 2016

本文实例讲述了CodeIgniter配置之SESSION用法。分享给大家供大家参考,具体如下:

刚使用Codeigniter时也被其中的SESSION迷惑过,后来就再也没用过CI自带的SESSION,想必还是有必要整理一下SESSION。为弄清CI中的SESSION,先来说一下PHP中SESSION是如何工作的。由于HTTP协议本身是无状态的,所以当保留某个用户的访问状态信息时,需要客户端有一个唯一标识传给服务端,这个唯一标识就是SESSION ID,存放在客户端的COOKIE中,然后服务端根据该标识读取存放的用户状态信息,达到保存会话状态的目的。PHP中启动一个会话需要执行下面语句:

session_start();

1、客户端每次请求时会有一些信息存放中HTTP头中发送给服务端,以用户第一次访问为例:

Request Headers

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

Accept-Encoding:gzip,deflate,sdch

Accept-Language:zh-CN,zh;q=0.8

Cache-Control:max-age=0

Connection:keep-alive

Host:s.local

User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36

2、服务端接到请求处理后并返回给客户端,并在HTTP Response中加上添加COOKIE的请求,告诉浏览器需要设置一个COOKIE,COOKIE名为PHPSESSID,值为r887k5n4scg32d4ba34huuhmq7,如:

Response Headers

Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0

Connection:Keep-Alive

Content-Length:0

Content-Type:text/html

Date:Sun, 08 Dec 2013 12:56:56 GMT

Expires:Thu, 19 Nov 1981 08:52:00 GMT

Keep-Alive:timeout=5, max=100

Pragma:no-cache

Server:Apache/2.2.11 (Win32) PHP/5.4.7

Set-Cookie:PHPSESSID=r887k5n4scg32d4ba34huuhmq7; path=/

X-Powered-By:PHP/5.4.7

3、当客户端再次访问该网站的页面时,浏览器会将该COOKIE发送给服务端,服务端根据COOKIE的值去读取服务器上存放SESSION的文件,拿到到会话信息,如:

Request Headers

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

Accept-Encoding:gzip,deflate,sdch

Accept-Language:zh-CN,zh;q=0.8

Cache-Control:max-age=0

Connection:keep-alive

Cookie:PHPSESSID=r887k5n4scg32d4ba34huuhmq7

Host:s.local

User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63

从而达到保存会话状态的目的。但也需要注意,如果获取到用户A登录的SESSION ID会怎么样?根据上面的逻辑,如果在请求过程中把获取到的SESSION ID一并发送给服务端,服务端根据SESSION ID读取文件,发现文件内容存在,从而判定用户为A用户,也就是获取到了A用户的用户状态,从而可能可以进行一些敏感操作。所以在会话有效期内,获取到了SESSION ID即获取到了用户的授权,这是比较危险的,以本地的一个管理系统为例,通过chrome登录后查看到客户端COOKIE如下图:

CodeIgniter配置之SESSION用法实例分析

假如如果通过某种手段获取到了SESSION ID, 可以模拟发送一个相同的COOKIE过去即可实现登录。FireFox中可添加COOKIE,打开Firebug后Cookies中新建cookie,确定之后刷新页面即可登录到管理系统,如下图:

CodeIgniter配置之SESSION用法实例分析

通常情况下可通过js获取到cookie,所以需要注意转义,防止数据展示时被执行了。接下来看看CI中的SESSION。在配置文件中有几个跟Session配置相关的参数,影响到Session的使用,它们是:

//session保存在cookie中的名称
$config['sess_cookie_name'] = 'ci_session';
//session的有效时间
$config['sess_expiration'] = 7200;
//是否关闭浏览器session失效
$config['sess_expire_on_close'] = FALSE;
//SESSION是否加密存放在COOKIE中
$config['sess_encrypt_cookie'] = FALSE;
//是否保存在数据库中
$config['sess_use_database']  = FALSE;
//存在数据库中,则数据库表名
$config['sess_table_name'] = 'ci_sessions';
//是否匹配IP
$config['sess_match_ip']  = FALSE;
//是否匹配UserAgent
$config['sess_match_useragent'] = TRUE;
//更新时间时间
$config['sess_time_to_update'] = 300;

CI自带的SESSION没有服务端文件存储,所有的信息都存放在客户端COOKIE中,当调用$this->load->library('session');时会启动一个会话,即设置一个COOKIE,COOKIE的内容如下:

Array
(
[session_id] => f05138a9513e4928cb0a57672cfe3b53
[ip_address] => 127.0.0.1
[user_agent] => Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36
[last_activity] => 1386569398
[user_data] =>
)

当客户端请求时会将这些信息在HTTP头中传输给服务端,服务端从HTTP头中读取到SESSION信息。同样的可以实现会话,但该方式有很多的不确定因素,根据源码说几点吧:

1、如果日志文件中出现:The session cookie data did not match what was expected. This could be a possible hacking attempt.说明两个问题:a.sess_encrypt_cookie为false,SESSION在COOKIE中未加密存放 b.读取到COOKIE后,校验失败。涉及到加解密、参数处理的情况,容易出现匹配不通过的情况,若不通过则清空SESSION。

2、如果sess_match_ip为true,当客户端IP变化时,SESSION将校验不通过,从而清空SESSION。

3、sess_match_useragent默认为true,当客户端UserAgent变化时,校验不通过,清空SESION。简单的例子,通过IE浏览器访问,若切换到不同的IE模式,Agent不同,所以校验不通过,清空SESSION。

可以看到,当出现上面任何一种情况时,SESSION都会清空,出现登录不成功或者跳转到登录页面的情况。如果说不加密、不校验IP、UserAgent呢?因为COOKIE是存放在客户端,需要伴随HTTP请求发给服务端,一来过多的COOKIE会影响速度,对一些图片等资源来说完全时浪费带宽;二来COOKIE只能存储4K的数据,加密处理后能存放的更小。

种种的不确定因素将产生各种奇怪的问题,避免过多的纠结,果断改用其他方式吧。

希望本文所述对大家基于CodeIgniter框架的PHP程序设计有所帮助。

PHP 相关文章推荐
需要发散思维学习PHP
Jun 29 PHP
解析PHP正则提取或替换img标记属性
Jun 26 PHP
PHP中比较时间大小实例
Aug 21 PHP
PHP实现手机号码中间四位用星号(*)隐藏的自定义函数分享
Sep 27 PHP
Zend Framework实现具有基本功能的留言本(附demo源码下载)
Mar 22 PHP
Ubuntu VPS中wordpress网站打开时提示”建立数据库连接错误”的解决办法
Nov 03 PHP
PHP互换两个变量值的方法(不用第三变量)
Nov 14 PHP
PHP实现动态添加XML中数据的方法
Mar 30 PHP
php微信公众号开发之现金红包
Apr 16 PHP
PHP实现的权重算法示例【可用于游戏根据权限来随机物品】
Feb 15 PHP
PHP使用JpGraph绘制折线图操作示例【附源码下载】
Oct 18 PHP
PHP设计模式(观察者模式)
Jul 07 PHP
CodeIgniter配置之routes.php用法实例分析
Jan 19 #PHP
CodeIgniter配置之config.php用法实例分析
Jan 19 #PHP
Codeigniter控制器controller继承问题实例分析
Jan 19 #PHP
php pthreads多线程的安装与使用
Jan 19 #PHP
PHP+swoole实现简单多人在线聊天群发
Jan 19 #PHP
PHP各种异常和错误的拦截方法及发生致命错误时进行报警
Jan 19 #PHP
[原创]CI(CodeIgniter)简单统计访问人数实现方法
Jan 19 #PHP
You might like
php 多线程上下文中安全写文件实现代码
2009/12/28 PHP
PHP三元运算符的结合性介绍
2012/01/10 PHP
php数组去重的函数代码
2013/02/03 PHP
在Windows上安装Node.js模块的方法
2011/09/25 Javascript
jQuery Tools tab使用介绍
2012/07/14 Javascript
ParseInt函数参数设置介绍
2014/01/02 Javascript
jquery easyui 对于开始时间小于结束时间的判断示例
2014/03/22 Javascript
JavaScript中实现继承的三种方式和实例
2015/01/29 Javascript
原生js实现移动开发轮播图、相册滑动特效
2015/04/17 Javascript
纯js代码实现未知宽高的元素在指定元素中垂直水平居中显示
2015/09/12 Javascript
JavaScript实现标题栏文字轮播效果代码
2015/10/24 Javascript
jQuery实现带玻璃流光质感的手风琴特效
2015/11/20 Javascript
精通JavaScript的this关键字
2020/05/28 Javascript
用JS实现轮播图效果(二)
2016/06/26 Javascript
[原创]JS基于FileSaver.js插件实现文件保存功能示例
2016/12/08 Javascript
javascript 的变量、作用域和内存问题
2017/04/19 Javascript
ionic实现底部分享功能
2017/05/11 Javascript
从vue源码解析Vue.set()和this.$set()
2018/08/30 Javascript
vue 设置 input 为不可以编辑的实现方法
2019/09/19 Javascript
vue使用showdown并实现代码区域高亮的示例代码
2019/10/17 Javascript
vuex存值与取值的实例
2019/11/06 Javascript
python实现文件名批量替换和内容替换
2014/03/20 Python
Python通过命令开启http.server服务器的方法
2017/11/04 Python
Python3内置模块pprint让打印比print更美观详解
2019/06/02 Python
python2和python3实现在图片上加汉字的方法
2019/08/22 Python
python实现横向拼接图片
2020/03/23 Python
Django websocket原理及功能实现代码
2020/11/14 Python
Django中如何用xlwt生成表格的方法步骤
2021/01/31 Python
英国家喻户晓的折扣商场:TK Maxx
2017/05/26 全球购物
银行领导证婚词
2014/01/11 职场文书
城建学院毕业生自荐信
2014/01/31 职场文书
小学生母亲节演讲稿
2014/05/07 职场文书
赵乐秦在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
2015新教师教学工作总结
2015/07/22 职场文书
完美处理python与anaconda环境变量的冲突问题
2021/04/07 Python
Python使用华为API为图像设置多个锚点标签
2022/04/12 Python