欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

CodeIgniter配置之SESSION用法实例分析

程序员文章站 2022-06-14 15:18:55
本文实例讲述了codeigniter配置之session用法。分享给大家供大家参考,具体如下: 刚使用codeigniter时也被其中的session迷惑过,后来就再也没...

本文实例讲述了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框架相关内容感兴趣的读者可查看本站专题:《codeigniter入门教程

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