关于同时设置 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 | 可选。用户输入的值,可作为回调函数的参数。 |
相关文章推荐
- 关于ligerUI中ligerTree代码中的一个bug,造成该控件无法通过url的POST方式加载数据
- Filter(一)——设置SimpleAdapter的Filter从而过滤数据
- Filter(一)——设置SimpleAdapter的Filter从而过滤数据
- 金蝶EAS,分录表格中F7字段实现数据过滤,FilterInfo多条件关系设置
- 关于dev的Gridview控件的行数据的颜色控制,根据不同的值设置不同颜色
- 利用IE关于Z-index的BUG造成的神奇效果
- 去除 ListView 在 setFilterText 设置过滤之后出现黑色弹框
- 关于使用DirectShow架构,传输YUV420数据的Filter与Video Renderer Filter连接问题的解决办法。
- php filter_var 过滤指定数据
- Ext.Net 1.x_Ext.Net.GridPanel之Filters 过滤数据
- datagrid数据格式解析-自定义过滤函数loadFilter
- 关于android手机设置项和数据缓存的一点经验
- dplyr 数据操作 数据过滤 (filter)
- 关于BeanUtil包的一个小bug,将数据存入集合每次只能存储一个数据
- 解决[[NSFileManager defaultManager] contentsOfDirectoryAtPath 方法获取不到数据的bug
- 关于时区date_default_timezone_set()的设置
- 大数据过滤及判断算法 -- Bitmap / Bloomfilter
- 关于Socket通信中多个线程同时向一个服务端口发送数据时的注意点
- SingleColumnValueFilter 过滤数据时候,返回的数据不正常问题
- 关于脏字典过滤问题-用正则表达式来过滤脏数据