[PHP]消毒变数的利器,filter_var和filter_var_array

只要有使用者输入的地方,都不能大意,因为一不小心就有可能被植入恶意程式码,所以消毒就变得非常重要,不过自己处理难免百密一疏,所幸PHP从5.2开始提供内建方法

就是filter_var和filter_var_array,前者处理单一变数,后者当然是处理阵列啰

搭配不同的参数,就可以消毒不同的型态,数字甚至可以自订範围,使用上非常的灵活,不过我在使用上,有一个固定的模式,就是接收表单后,要检查各个值是否符合规定,以及是否有缺值,因为实在是很懒得针对每个去写检查,想要一坨一次检查

想当然就是用filter_var_array直接检查POST或GET了,但是发现每个值都要另外处理参数,实在是太麻烦了,经过评估发现我大部分都是文字比较多,所以就写了一个方法,让预设处理是FILTER_SANITIZE_STRING,若是数字或其他的再特别指定

至于要怎么知道有违法的值,有个参数很好用,就是FILTER_NULL_ON_FAILURE,失败自动回传null,我再检查结果阵列内有任何是null,如果有就整陀不能用啦

/*** 消毒变数,未指定的key依照预设的方式消毒* @param array $data 来源阵列* @param mixed $args 指定各数值的消毒方式* @param filter_flag $default_filter 针对未指定的值採用的消毒方式* * @return mixed 已消毒的array,若某个值过滤失败则回传false*/function sanitize_var($data, $args=array(), $default_filter = FILTER_SANITIZE_STRING){foreach($data as $key=>$value){if(!array_key_exists($key, $args)){$args[$key] = array("filter"=>$default_filter, "flags"=>FILTER_NULL_ON_FAILURE);}else{if(is_array($args[$key])){  //若原本有指定参数,则加上FILTER_NULL_ON_FAILURE,若没有则指定FILTER_NULL_ON_FAILUREif(array_key_exists("flags", $args[$key])){$args[$key]["flags"] |= FILTER_NULL_ON_FAILURE;}else{$args[$key]["flags"] = FILTER_NULL_ON_FAILURE;}}else{$tmp_filter = $args[$key];$args[$key] = array("filter"=>$tmp_filter, "flags"=>FILTER_NULL_ON_FAILURE);}}}$result = filter_var_array($data, $args);foreach($result as $key=>$value){if(is_null($value)){return FALSE;}}return $result;}//account和password两个是必要值,若有缺则会返回false$data = sanitize_var($_POST, array('account'=>FILTER_SANITIZE_STRING, 'password'=>FILTER_SANITIZE_STRING));if($data){  //do something}else{  //value is invalid}//不指定必要值,预设会将包含的变数预设以FILTER_SANITIZE_STRING进行消毒$data = sanitize_var($_GET);//直接使用$data内的值

感觉是不是方便了不少,一次解决缺值检查跟类型消毒,如果有更好的方法或改良,欢迎提供出来参考参考,大家互相漏气求进步~


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章