在PHP中循环POST变量的正确(安全)方法

在PHP中循环POST变量的正确(安全)方法,php,post,jqgrid,Php,Post,Jqgrid,我有一些遗留代码要更新。在该版本的代码(jqGrid的后端)中,将搜索参数发送到POST变量中的服务器。POST键是字段名,值是搜索值。从几年前开始,我开始只通过IDE建议的filter\u input函数访问POST变量。但是,我还没有找到一种推荐的方法,可以在不直接访问POST变量的情况下循环使用POST变量 搜索参数的旧代码部分如下所示: /* * Search Filter */ if ($search){ $where_string = ' where '; for

我有一些遗留代码要更新。在该版本的代码(jqGrid的后端)中,将搜索参数发送到POST变量中的服务器。POST键是字段名,值是搜索值。从几年前开始,我开始只通过IDE建议的
filter\u input
函数访问POST变量。但是,我还没有找到一种推荐的方法,可以在不直接访问POST变量的情况下循环使用POST变量

搜索参数的旧代码部分如下所示:

/*
 * Search Filter
 */
if ($search){
    $where_string = ' where ';
    foreach ($_POST as $key => $value){
        if (in_array($key,array('_search','nd','rows','page','sidx','sord','arg1','arg2'))==true){
            continue;
        }
        //put in functionality to search for exact values
        //to search for exact values, include a * character before the value you are searching for
        if (strpos($value, "*") === 0){
            //exact search
            $value = substr($value,1);
        }else{
            //like search
            $value = "%".$value."%";
        }
        $key = $mysqli->real_escape_string($key);
        $value = $mysqli->real_escape_string($value);
        $where_string .= '`'.$key.'` like "'.$value.'" AND ';
    }
    $where_string = rtrim($where_string,' AND ');
}
我的IDE给出的警告是:
不要直接访问Superglobal$\u POST数组。

foreach
行上。只是不确定我是否应该完全避免这种循环,或者是否有一种方法可以使用filter_输入。它是任何表的一种通用代码。感谢您的指导。

如果您知道自己在做什么,并采取一些预防措施过滤和转义数据等,您可以直接安全地访问$\u POST中的数据。如果您没有将代码移植到某个框架,而该框架对您起作用,那么您应该研究清理数据的方法,并且可以安全地继续使用当前的foreach循环。我很好奇,您使用哪个IDE?即使您首先尝试使用
数组键($\u POST)
获取所有键,也可以直接使用$\u POST。这无疑是一个非常有限的警告。在事先不知道所有可能的键的情况下,您将不得不忽略该警告并执行您必须执行的操作。如果您可以设置某种类型的键白名单数组,那么您至少可以限制抛入sql的内容,并确保没有人传入您不期望的键。我怀疑该警告与在sql语句中直接使用POST变量有关。Netbeans给出此警告正是出于这个原因。这并不意味着直接访问POST变量本身就是危险的。如果你在这样一个低级别上运行,你将不得不直接与超全局变量交互。我想,你可能会有一个白色的钥匙列表,然后依次尝试每个钥匙?作为参考,SphfOy的HTTP基础组件(在这一点上相当普遍)在请求对象初始化时直接访问所有PHP的超全局。