参数过滤配置

2022-10-13 11:08:05
admin
1206
最后编辑:admin 于 2022-10-26 11:21:03

我们在访问应用的每个页面时,框架都会自动对页面请求中的参数进行验证,那么这个过程中框架所依据的验证规则是从何而来的呢? 

我们在框架的 config/filter.php 文件中,通过指定每个模块页面的验证器,来告诉框架应该使用哪个验证方法对页面参数进行验证。 

关于验证器,可参见数据过滤类。 

框架会自动根据配置中所给的验证器解析出其对应的验证方法及参数,进而对数据进行验证。 

例如: 设置验证器为 int,则框架会使用 checkInt() 方法对数据进行验证。 

在配置文件中,对于需要有操作参数的验证方法,比如 checkEqual()、checkRGE()等,则采用 验证器::验证器参数 的方式。 例如: 

指定 reg::/^[a-zA-Z0-9]+$/ ,框架会使用 checkREG($var,'/^[a-zA-Z0-9]+$/') 方法对数据进行验证; 

指定 equal::yes ,框架会使用 checkEqual($var, 'yes') 方法对数据进行验证。 

即:“验证器参数”会作为验证方法的参数被带入执行。 

配置参数验证规则 

在 config/filter.php 文件中,框架声明了一个 $filter 对象,我们基于该对象配置不同模块页面的验证规则: 

1. 配置不同应用场景下的正则表达式,方便调用,避免重复书写麻烦。 

// $filter->rules->规则名 = '正则表达式'; 
$filter->rules->md5        = '/^[a-z0-9]{32}$/'; 
$filter->rules->base64     = '/^[a-zA-Z0-9\+\/\=]+$/'; 
$filter->rules->checked    = '/^[0-9,]+$/'; 
$filter->rules->idList     = '/^[0-9\|]+$/'; 
$filter->rules->lang       = '/^[a-zA-Z_\-]+$/'; 
$filter->rules->any        = '/./'; 
$filter->rules->number     = '/^[0-9]+$/'; 
$filter->rules->orderBy    = '/^\w+_(desc|asc)$/i'; 
$filter->rules->word       = '/^\w+$/';

2. 针对指定的模块、方法页面,对请求中的参数设置验证规则。传参类型为 get 或 cookie。 

/**
 * $filter->模块名->方法名/default->传参类型['参数名'] = '验证器'; 
 * $filter->模块名->方法名/default->传参类型['参数名'] = '验证器::验证器参数'; 
 */
 
// 对 bug 模块 browse 方法页面中通过 cookie 传递的 bugModule 参数值进行整型类型验证。 
// 访问该页面时,框架会自动使用 checkInt() 方法对该值进行验证。 
$filter->bug->browse->cookie['bugModule']      = 'int'; 

// 对 bug 模块的所有页面中通过 cookie 传递的 preProductID 参数值进行整型类型验证。 
$filter->bug->default->cookie['preProductID']  = 'int';

当验证器为 reg 时,可以使用 $filter->rulers 对象的属性作为验证器参数,避免了重复书写正则表达式的麻烦。 例如: 

// 框架会使用 checkREG($value, '/^\w+$/') 方法对该值进行验证。 
$filter->user->edit->get['from'] = 'reg::word';

3. 配置默认验证规则 

通过 $filter->default 对象设置默认验证规则,即对所有模块页面通用。 例如:

/**
 * $filter->default->规则名 = '验证器'; 
 * $filter->default->传参类型['参数名'] = '验证器'; 
 * $filter->default->传参类型['参数名'] = '验证器::验证器参数'; 
 */
$filter->default->moduleName = 'code'; 
$filter->default->methodName = 'code'; 
$filter->default->paramName  = 'reg::paramName'; 
$filter->default->paramValue = 'reg::paramValue';

4. 使用 PHP 的 is_xxx 函数验证 

除了 zentaoPHP 框架内置的验证方法外,还可以使用 PHP 提供的 is_xxx 函数进行验证操作。比如要验证参数为字符串,则可以通过指定 string ,框架会自动使用 is_string 函数对参数验证。 例如: 

$filter->ci->checkCompileStatus->get['gitlabOnly'] = 'string';

所以,除了验证器,能与 'is_ ' 组合成 PHP 函数的标识符也可以作为验证规则进行配置。