CodeIgniter框架config与SESSION配置

config配置

配置说明

$config['language']:指定项目语言包。需要注意的时Codeigniter自带的类库错误提示语言包位于/system/language/english/目录下,当这里配置非english时, 如果需要用到这些类库,则需要拷贝语言包到指定的目录中,否则会出现load出错。

$config['charset']:设置系统使用的编码,在某些需要指定编码的函数中会用到,系统、数据库统一编码即可。

$config['enable_hooks']:钩子开关控制,设置为true表示允许使用钩子,否则不允许。

$config['subclass_prefix']:设置自定义类库、函数的前缀,默认为MY_,比如需要重写language helper中的lang方法时,只需要在helper目录下创建MY_language_herper.php,并实现lang函数即可实现“重载”。这里MY_即为subclass_prefix中定义的值。

$config['permitted_uri_chars']:设置URL中允许的字符。

$config['log_threshold']:设置日志记录等级,为0则关闭日志记录,为4则记录所有信息,一般情况设置为1即可。设置之后需要确认下logs目录是否有写入权限。

$config['proxy_ips']:当服务器使用了代理时,REMOTER_ADDR获取的就是代理服务器的IP了,需要从HTTP_X_FORWARDED_FOR、HTTP_CLIENT_IP、HTTP_X_CLIENT_IP、HTTP_X_CLUSTER_CLIENT_IP或其他设定的值中获取。这里设定的就是代理服务器的IP,逗号分隔。

$config['encryption_key']:加密值,如果要用到CI自带的SESION则必须要设置该值。CI的自带SESSION存储与Cookie中,为安全起见,作加密处理。

配置读取

CI初始化开始过程中会通过get_config函数加载config.php文件,同时也提供了config_item来获取config的值,如:

echo config_item('charset');

CI也提供了一个配置类用来维护配置文件。也可以通过下面方式来获取和设置config的值,当设置之后调用get_config的结果同样会变化,所以可以在某些逻辑前修改config的值。

//获取config中配置的charset值
echo $this->config->item('charset');
//重新设置config中charset的值
$this->config->set_item('charset', 'gbk')

配置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:xxxx,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:xxxx,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的数据,加密处理后能存放的更小。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索文件
, http
, 函数
, 加密
, 配置
用户
webconfig配置session、tp框架config怎么配置、codeigniter config、codeigniter session、codeigniter框架,以便于您获取更多的相关知识。

时间: 2024-09-12 04:01:39

CodeIgniter框架config与SESSION配置的相关文章

PHP的Symfony和CodeIgniter框架的Nginx重写规则配置_nginx

SymfonySymfony国外很流行的php框架,目前国内用的相对较少,但是一定会在国内火起来. nginx重写规则如下 server { server_name jb51.net www.jb51.net; root /data/site/www.jb51.net; location / { # try to serve file directly, fallback to rewrite try_files $uri @rewriteapp; } location @rewriteapp

使用 CodeIgniter 框架快速开发 PHP 应用(六)

原文:使用 CodeIgniter 框架快速开发 PHP 应用(六) 简化使用 Session 和安全 理论说得够多了! 现在让我们开始写我们自己的应用. 在这一章里,我们将会大致描述一下我们要建立的一个应用系统,而且我们分析一些会影响到网站系统的的基本问题也就是会话管理和安全. 在这一章,我们将会见到: .如何使你的网页安全 .如何使用 CI 的会话类 开始用 CI 设计一个实际的网站 我们已经看过 CI 安装时生成的welcome页以及它内部动作中控制器文件和视图文件的动作流程. 实际上这就

PHP CodeIgniter框架的工作原理研究

 这篇文章主要介绍了PHP CodeIgniter框架的工作原理研究,本文首先分析了它的工作流程,然后总结了它的工作原理,需要的朋友可以参考下     CodeIgniter(以下简称CI,官网以及中国站)是一个流行的PHP框架,小巧但功能强大,简洁轻量同时拥有很好的扩展性,在国内也比较受欢迎.另一方面,CI却没有与时俱进,并不支持PHP5.3之后的一些特性,导致它相对更适合较老一些的项目.虽然如此,CI仍是一个优秀的框架,而且它本身内核较小,源码优雅,适于学习. CI易于使用,可以方便的开发出

使用 CodeIgniter 框架快速开发 PHP 应用(二)

原文:使用 CodeIgniter 框架快速开发 PHP 应用(二)二分钟: 建立一个 CodeIgniter 网站 用CI建一个网站很容易. 这一章很短,解释了用CI制作网站时发生了些什么,哪些文件被创建,让我们来瞧一瞧: . 创建网站需要什么软件? . 安装 CI 文件: 一个简单的下载和解压缩操作 . CI 的基本设置: 有哪些文件夹及它们是如何组织的 . CI 安装时默认的控制器和视图 . 一些简单的修改来演示CI如何运作 准备知识 CodeIgniter 有较好的版本兼容性. 它工作在

使用 CodeIgniter 框架快速开发 PHP 应用(一)

原文:使用 CodeIgniter 框架快速开发 PHP 应用(一)对 CodeIgniter 的介绍 大多数PHPer都想写出运行状态良好的应用程序,而且希望尽可能做得简单且不费事.这篇文章是有关 CodeIgniter的(以后简称CI),CI是一个达成上面目的的所谓框架. 如果你只是要达成一个最终的结果,而把中间所有的编码细节和复杂统统丢给一个框架,CI是你最好的朋友. CI有很多优点:免费, 轻量级, 容易安装, 它能使你的编程生涯变得很轻松. 这一章我们会告诉你: . CI 能为你做什么

使用 CodeIgniter 框架快速开发 PHP 应用(三)

原文:使用 CodeIgniter 框架快速开发 PHP 应用(三)分析网站结构 既然我们已经安装 CI ,我们开始了解它如何工作. 读者已经知道 CI 实现了MVC式样. 通过对目录和文件的内容进行分类, 而不是让代码大块大块地纠集在一起. 这一章,我们将会对 MVC 理论做个简短的介绍, 然后再介绍 CI 的MVC实现方式.特别地,要了解那些目录和文件如何互相交换信息?网站结构是怎样的?以及CI是如何自如地动作于其中的? 这一章将会介绍: .MVC 如何架构一个动态网站 .CI如何接收和分析

PHP CodeIgniter框架的工作原理研究_php技巧

CodeIgniter(以下简称CI,官网以及中国站)是一个流行的PHP框架,小巧但功能强大,简洁轻量同时拥有很好的扩展性,在国内也比较受欢迎.另一方面,CI却没有与时俱进,并不支持PHP5.3之后的一些特性,导致它相对更适合较老一些的项目.虽然如此,CI仍是一个优秀的框架,而且它本身内核较小,源码优雅,适于学习. CI易于使用,可以方便的开发出web应用.先来看一下CI的工作流程图(此处内容引用自http://codeigniter.org.cn/user_guide/overview/app

使用 CodeIgniter 框架快速开发 PHP 应用(四)

原文:使用 CodeIgniter 框架快速开发 PHP 应用(四)使用 CI 简化数据库开发 你学习CI 是因为你想要使编程更容易和更有生产力.这一章讲述CI的Active Record类. 如果CI只提供一个Active Record类,它还是物超所值的.当然,CI是免费的,只不过我要强调Active Record(以后简称AR)类的价值是非常高的,它是你提高生产力的主要工具. AR使你以最小的代价获得最大的回报. 它简单,易于使用和维护. 这一章描述CI如何连接到一个数据库,你如何使用AR

使用 CodeIgniter 框架快速开发 PHP 应用(七)

原文:使用 CodeIgniter 框架快速开发 PHP 应用(七) CodeIgniter 和对象 这是玩家章节.它讲述的是 CodeIgniter 的工作原理,也就是揭开CI头上'神秘的面纱'.如果你是 CI 的新手,你可能想要跳过它.不过, 迟早, 你可能想要了解CI的幕后在发生什么 ,为什么不真正的玩转它呢? 当我刚开始使用 CodeIgniter 的时候,对象使我迷惑. 我是在使用 PHP 4的时候接触CI的, PHP4并不是真正的面向对象的语言.我在一大堆对象和方法.属性和继承,还有