如何实现一个php框架系列文章【5】安全处理输入

时间:2022-12-10 09:03:33

所有的外部输入参数都应该检查合法性。

未正确处理输入数据将可能导致sql注入等漏洞。

 

框架提供系列函数来取$_REQUEST中的值

requestInt

requestString

requestFloat

requestBool

 

ps:注意$_REQUEST中变量类型可能会是数组

如请求为 ?i[]=1,那么$_REQUEST['i'] 的值为array(1)

做校验的时候要考虑全面以防止php warning信息泄露

 

 

另外再介绍一下kv json格式的数据校验。

有时为了在项目中保留一定扩展性,会使用json格式的数据,这种数据又该如何校验呢。

 

//校验键值形式{k1:v1, k2:v2, k3:v3 ...}的json数据,可以对每一对kv进行校验

requestKvJson

 

 

 

 

部分实现代码

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 //校验整数,失败返回$defaultfunction checkInt($var$default = 0) {    return  is_numeric($var) ? intval($var, (strncasecmp($var'0x', 2) == 0 || strncasecmp($var'-0x', 3) == 0) ? 16 : 10) : $default;} //校验字符串 $check为正则表达式function checkString($var$check ''$default '') {    if (!is_string($var)) {        if(is_numeric($var)) {            $var = (string)$var;        }        else {            return $default;        }    }    if ($check) {         return (preg_match($check$var$ret) ? $ret[1] : $default);    }     return $var;} /*    校验kv json,    如果想要一个这样的数据{id:1, 'type':'single_text', 'required': true, 'desc':'this is a text'}    那么$desc可以这样写    array(   array('id', 'Int'),   array('type', 'string', PATTERN_NORMAL_STRING),   array('required', 'Bool', false),   array('desc', 'string', PATTERN_NORMAL_STRING),))*/function checkKvJson($var$desc array()) {    if(is_string($var)) {        $var = json_decode($var, true);    }    if(!$var || !is_array($var)) {        return array();    }     if($desc)    foreach($desc as $d) {         if(!isset($var[$d[0]])) {            return array();        }         $ps array_slice($d, 2);        array_unshift($ps$var[$d[0]]);        $var[$d[0]] = call_user_func_array('check'.$d[1], $ps);        if($var[$d[0]] === false && strcasecmp($d[1], 'Bool')) {            return array();        }    }     return $var;}