您的位置:首页 > 其它

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

2013-11-22 12:08 295 查看


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

当配置文件同时定义了这两项配置常量时,例如:


'VAR_FILTERS' => 'htmlspecialchars', // 全局系统变量的默认过滤方法

'DEFAULT_FILTER' => 'htmlspecialchars', // 默认参数过滤方法

复制代码
此时获取来的$_POST是进行过一次 C('VAR_FILTERS') 过滤的,与此同时,获取的$this->_post('xxx')是对$_POST数据进行C('DEFAULT_FILTER')过滤,导致数据二次过滤问题。即使用$this->_post('xxx', false)也是获取到已经进行C('VAR_FILTERS')过滤的内容。

还有一点,在App.class.php中参数过滤的方法是


if(C('VAR_FILTERS')) {

$filters = explode(',',C('VAR_FILTERS'));

foreach($filters as $filter){

// 全局参数过滤

array_walk_recursive($_POST,$filter);

array_walk_recursive($_GET,$filter);

}

}

复制代码
此时配置信息


'VAR_FILTERS' => 'htmlspecialchars', // 全局系统变量的默认过滤方法

复制代码
会发现参数死活不过滤

修改配置信息为


'VAR_FILTERS' => 'h', // 全局系统变量的默认过滤方法

复制代码
同时新增function h 为


function h(&$str){

$str = htmlspecialchars($str, ENT_QUOTES);

}

复制代码
即可过滤。

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


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() 函数

PHP Array 函数


定义和用法

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

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

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

语法

array_walk_recursive(array,function,userdata)

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



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: