手机版

CodeIgniter配置的会话使用示例分析

时间:2021-09-18 来源:互联网 编辑:宝哥软件园 浏览:

本文说明了CodeIgniter配置的SESSION用法。分享给大家参考,如下:

当我第一次使用Codeigniter时,我被SESSION搞糊涂了。后来我再也没有用过CI带来的SESSION,所以有必要把SESSION整理一下。为了理解CI中的SESSION,我们来谈谈SESSION在PHP中是如何工作的。由于HTTP协议本身是无状态的,在保留用户的访问状态信息时,客户端需要有一个唯一的标识符发送给服务器。唯一的标识符是SESSION ID,存储在客户端的COOKIE中,然后服务器根据标识符读取存储的用户状态信息,达到保存会话状态的目的。要在PHP中启动一个会话,需要执行以下语句:复制代码如下: session _ start();

1.每次客户端请求时,都会将一些信息存储在HTTP头中并发送给服务器。以用户第一次访问为例:复制代码如下:请求头接受3360文本/html、application/XHTML XML、application/XML;q=0.9,image/webp,*/*;q=0.8Accept-Encoding:gzip,deflate,sdchAccept-Language:zh-CN,zh;q=0.8 cache-control : max-age=0 connection : keep-alivehost :s . local user-agent : Mozilla/5.0(Windows NT 6.1)applebwebkit/537.36(KHTML,像Gecko)Chrome/31 . 0 . 1650 . 63 Safari/537.36

2.服务器收到请求并处理后返回给客户端,并在HTTP Response中添加一个添加cookie的请求,告诉浏览器需要设置一个cookie,这个cookie叫做PHPSESSID,其值为r887k5n4scg32d4ba34huuhmq7。例如,复制代码如下:响应头缓存控制:无存储、无缓存、必须更新、后检查=0。预检查=0connection : keep-AliveContent-length :0 content-type : text/html date : sun,2013年12月8日12:56:56 GMTExpires:Thu,1981年11月19日08:52:00 GMTKeep-alive: time out=5,最大值=100Pragma:no路径=/X-power-by : PHP/5 . 4 . 7

3.当客户端再次访问网站页面时,浏览器会将COOKIE发送给服务器,服务器会根据COOKIE的值读取存储在服务器上的session文件,得到SESSION信息,如:复制代码如下: Request Headers Accept 3360 Text/HTML,Application/XHTML XML,Application/XML;q=0.9,image/webp,*/*;q=0.8Accept-Encoding:gzip,deflate,sdchAccept-Language:zh-CN,zh;q=0.8 cache-control : max-age=0 connection : keep-alivecookie : phpsessid=r887 k5n 4 SCG 32d 4b a 34 huuhmq 7 host :s . local user-agent : Mozilla/5.0(Windows NT 6.1)applebwebkit/537.36(KHTML,像壁虎一样)Chrome/31.0.1650.63

从而达到保存会话状态的目的。然而,我们也应该注意如果我们获得用户a登录的SESSION ID会发生什么。根据上述逻辑,如果在请求过程中将获取的SESSION ID发送给服务器,服务器根据SESSION ID读取文件,发现文件内容存在,从而判断用户是用户,即获取用户的用户状态,从而可能进行一些敏感操作。所以在会话有效期内,获取SESSION ID的同时获取用户的授权,是相当危险的。以本地管理系统为例。通过chrome登录后,客户端COOKIE如下所示:

如果您通过某种方式获得了SESSION ID,那么您可以模拟发送相同的COOKIE来登录。可以在FireFox中添加cookies,打开Firebug后在cookies中创建新的Cookies,确认后通过刷新页面登录管理系统,如下图所示:

Cookie通常可以通过js获取,所以需要注意转义,防止数据在呈现时被执行。接下来,看看配置项中的会话。配置文件中有几个与会话配置相关的参数,这些参数会影响会话的使用。它们是:

//会话cookie中保存的名称为$ config[' sess _ cookie _ name ']=' ci _ session ';//会话的有效时间为$ config[' sess _ expire ']=7200;//是否关闭浏览器会话expires $ config[' sess _ expire _ on _ close ']=false;//SESSION被加密并存储在COOKIEs $ config中[' sess _ encrypt _ CooKie ']=false;//保存在数据库$ config中[' sess _ use _ database ']=false;//存在于数据库中,数据库表名$ config[' sess _ table _ name ']=' ci _ sessions ';//匹配IP $ config[' sess _ match _ IP ']=false;//是否匹配user agent $ config[' sess _ match _ user agent ']=true;//更新时间$ config[' sess _ time _ to _ update ']=300;CI自己的SESSION没有服务器文件存储,所有信息都存储在客户端COOKIE中。当调用$this-load-library(“会话”)时;将启动一个会话,即设置一个COOKIE,COOKIE的内容如下:

array([session _ id]=f 05138 a 9513 e 4928 CB 0a 57672 cfe 3b 53[IP _ address]=127 . 0 . 0 . 1[user _ agent]=Mozilla/5.0(Windows NT 6.1;Wow64) apple WebKit/537.36 (khtml,像gecko)chrome/31 . 0 . 1650 . 63 safari/537.36[last _ activity]=1386569398[user _ data]=)当客户端请求时,信息将在HTTP头中传输到服务器。谈话也可以实现,但这种方式有很多不确定因素。根据源代码,说几点:

1.SESSION COOKIE数据与预期的不匹配。这可能是一次可能的黑客攻击尝试出现在日志文件中,它显示了两个问题:a . sess _ encrypt _ COOKIE为false,并且会话未加密地存储在COOKIE中;b .读取cookie后,验证失败。当涉及到加解密和参数处理时,很容易匹配失败。如果失败,会话将被清除。

2.如果sess_match_ip为真,当客户端的ip发生变化时,SESSION将无法通过验证,从而清除SESSION。

3.sess_match_UserAgent的默认值为真。当客户端用户代理改变时,验证失败,SESION被清除。举个简单的例子,如果你切换到不同的IE模式,代理就会不一样,所以验证失败,SESSION就会被清除。

可以看到,当出现以上任何一种情况时,SESSION都会被清除,登录不成功或者登录页面会被跳转。如果我们不加密,检查IP和UserAgent呢?因为cookies存储在客户端,所以它们需要与HTTP请求一起发送到服务器端。对于图片等一些资源来说,过多的cookies会影响速度,完全浪费带宽。其次,COOKIE只能存储4K的数据,加密后可以存储得更小。

各种不确定因素会产生各种奇怪的问题,所以要避免过多纠缠,果断使用其他方法。

更多对CodeIgniter框架感兴趣的读者,请查看本网站主题:《codeigniter入门教程》。

希望本文对基于CodeIgniter框架的PHP编程有所帮助。

版权声明:CodeIgniter配置的会话使用示例分析是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。