枚举类型参数过滤不严谨

框架里面使用in_array()这个函数去做枚举类型参数的过滤
然而php是弱类型语言,假设用户输入的值是 "2abc" 而枚举值是 array (1,2,3 ) 
php在比较 "2abc" == 2 的时候会自动把 "2abc"转换成数值2
所以调用 in_array("2abc",array(1,2,3)) 时返回的是true
in_array()函数是有第三个参数的,可以解决这个问题
 
已邀请:

dogstar - PhalApi创始人

赞同来自:

in_array()的第三个参数是可以解决 in_array("2abc",array(1,2,3)) 误判的这个问题。

但会导致原本可以的配置全部失效,如:
var_dump(in_array('1', array(1,2,3), true)); //false
var_dump(in_array('2', array(1,2,3), true)); //
false
var_dump(in_array('3', array(1,2,3), true)); //false

稍微好一点的方法是,将配置的range数组全部转换成字符串再比较,但这依然会存在另外一个问题。即当数据源来自整包解析,而非直接GET/POST时,数据源很可能是非字符串的类型。

所以,我们暂时不对此作改动,而仍将使用和决定权掌控在项目开发同学的手上。简单来说,可以这样配置规则(枚举配置成字符串):
var_dump(in_array('2abc', array('1','2','3'))); //修正不合理的判断

var_dump(in_array('2', array('1','2','3'))); //GET方式的参数仍然有用

要回复问题请先登录注册