关于同时设置 VAR_FILTERS 和 DEFAULT_FILTER 造成数据二次过滤的BUG

关于同时设置 VAR_FILTERS 和 DEFAULT_FILTER 造成数据二次过滤的BUG

 






当配置文件同时定义了这两项配置常量时,例如:
  1. 'VAR_FILTERS' => 'htmlspecialchars',  // 全局系统变量的默认过滤方法
  2.  'DEFAULT_FILTER' => 'htmlspecialchars', // 默认参数过滤方法
复制代码
此时获取来的$_POST是进行过一次 C('VAR_FILTERS') 过滤的,与此同时,获取的$this->_post('xxx')是对$_POST数据进行C('DEFAULT_FILTER')过滤,导致数据二次过滤问题。即使用$this->_post('xxx', false)也是获取到已经进行C('VAR_FILTERS')过滤的内容。


还有一点,在App.class.php中参数过滤的方法是
  1. if(C('VAR_FILTERS')) {
  2.             $filters    =   explode(',',C('VAR_FILTERS'));
  3.             foreach($filters as $filter){
  4.                 // 全局参数过滤
  5.                 array_walk_recursive($_POST,$filter);
  6.                 array_walk_recursive($_GET,$filter);
  7.             }
  8.         }
复制代码
此时配置信息
  1. 'VAR_FILTERS' => 'htmlspecialchars',  // 全局系统变量的默认过滤方法
复制代码
会发现参数死活不过滤

修改配置信息为
  1. 'VAR_FILTERS' => 'h',  // 全局系统变量的默认过滤方法
复制代码
同时新增function h 为
  1. function h(&$str){
  2.     $str = htmlspecialchars($str, ENT_QUOTES);
  3.  }
复制代码
即可过滤。


===============================================

ThinkPHP函数详解:C方法

C方法是ThinkPHP用于设置、获取,以及保存配置参数的方法,使用频率较高。
了解C方法需要首先了解下ThinkPHP的 配置 ,因为C方法的所有操作都是围绕配置相关的。ThinkPHP的配置文件采用PHP数组格式定义。
由于采用了函数重载设计,所以用法较多,我们来一一说明下。
设置参数  
C('DB_NAME','thinkphp');
表示设置DB_NAME配置参数的值为thinkphp,由于配置参数不区分大小写,所以下面的写法也是一样:
C('db_name','thinkphp');
但是建议保持统一大写的配置定义规范。
项目的所有参数在未生效之前都可以通过该方法动态改变配置,最后设置的值会覆盖前面设置或者惯例配置里面的定义,也可以使用参数配置方法添加新的配置。
支持二级配置参数的设置,例如:
C('USER.USER_ID',8);
配置参数不建议超过二级。
如果要设置多个参数,可以使用批量设置,例如:
$config['user_id'] = 1;
$config['user_type'] = 1;
C($config);
如果C方法的第一个参数传入数组,就表示批量赋值,上面的赋值相当于:
C('USER_ID',1);
C('USER_TYPE',1);

获取参数  
要获取设置的参数,可以用:
$userId = C('USER_ID');
$userType = C('USER_TYPE');
如果USER_ID参数尚未定义过,则返回NULL。
也可以支持获取二级配置参数,例如:
$userId = C('USER.USER_ID');
如果传入的配置参数为空,表示获取全部的参数:
$config = C();

保存设置  
3.1版本增加了一个永久保存设置参数的功能,仅针对批量赋值的情况,例如:
$config['user_id'] = 1;
$config['user_type'] = 1;
C($config,'name');
在批量设置了config参数后,会连同当前所有的配置参数保存到缓存文件(或者其他配置的缓存方式)。
保存之后,如果要取回保存的参数,可以用
$config = C('','name');
其中name就是前面保存参数时用的缓存的标识,必须一致才能正确取回保存的参数。取回的参数会和当前的配置参数合并,无需手动合并。

===============================================

PHP array_walk_recursive() 函数

定义和用法

与 array_walk() 函数 类似,array_walk_recursive() 函数对数组中的每个元素应用回调函数。不一样的是,如果原数组中的元素也是数组,就会递归地调用回调函数,也就是说,会递归到更深层的数组中去。

典型情况下,function 接受两个参数。array 参数的值作为第一个,键名作为第二个。如果提供了可选参数 userdata ,将被作为第三个参数传递给回调函数。

如果回调函数需要直接作用于数组中的值,可以将回调函数的第一个参数指定为引用,这样对这些单元的任何改变也将会改变原始数组本身。

语法

array_walk_recursive(array,function,userdata)
参数 描述
array 必需。规定数组。
function 必需。用户自定义函数的名称。
userdata 可选。用户输入的值,可作为回调函数的参数。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值