CodeIgniter配置之SESSION用法实例分析
本文实例讲述了codeigniter配置之session用法。分享给大家供大家参考,具体如下:
刚使用codeigniter时也被其中的session迷惑过,后来就再也没用过ci自带的session,想必还是有必要整理一下session。为弄清ci中的session,先来说一下php中session是如何工作的。由于http协议本身是无状态的,所以当保留某个用户的访问状态信息时,需要客户端有一个唯一标识传给服务端,这个唯一标识就是session id,存放在客户端的cookie中,然后服务端根据该标识读取存放的用户状态信息,达到保存会话状态的目的。php中启动一个会话需要执行下面语句:
1、客户端每次请求时会有一些信息存放中http头中发送给服务端,以用户第一次访问为例:
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,如:
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的文件,拿到到会话信息,如:
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如下图:
假如如果通过某种手段获取到了session id, 可以模拟发送一个相同的cookie过去即可实现登录。firefox中可添加cookie,打开firebug后cookies中新建cookie,确定之后刷新页面即可登录到管理系统,如下图:
通常情况下可通过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框架相关内容感兴趣的读者可查看本站专题:《codeigniter入门教程》
希望本文所述对大家基于codeigniter框架的php程序设计有所帮助。
推荐阅读
-
CodeIgniter配置之routes.php用法实例分析
-
CodeIgniter配置之database.php用法实例分析
-
CodeIgniter配置之config.php用法实例分析
-
CI(CodeIgniter)模型用法实例分析
-
CodeIgniter配置之SESSION用法实例分析
-
jsp编程中session的用法实例分析
-
PHP cookie与session会话基本用法实例分析
-
CodeIgniter配置之autoload.php自动加载用法分析
-
CodeIgniter配置之autoload.php自动加载用法分析_php实例
-
CodeIgniter配置之database.php用法实例分析,codeigniterdatabase