在一个函数中清理整个mysql查询字符串

时间:2015-12-04 18:12:32

标签: php mysql string sql-injection

目前,我有一个设置,以便在PHP中进行MySQL查询时,我会调用此函数:

getfromtable("table_name",array("field1","field2",...),"something='value' and something2='".$_GET['INPUT']."' and something3=\"".$_GET['INPUT2']."\" and count=3");

然后该函数排列参数并调用此函数:

$result=mysqli_query("SELECT field1,field2 FROM table_name where something='value' and something2='".$_GET['INPUT']."' and something3=\"".$_GET['INPUT2']."\" and count=3;",MYSQLI_USE_RESULT);

这反过来意味着这个SQL语句:

SELECT field1,field2 FROM table_name where something='value' and something2='<user input 1>' and something3="<user input 2>" and count=3;

其中<user input 1><user input 2>是直接来自查询字符串的两个值。

问题是这对SQL注入是开放的。另一个问题是它在我的代码中几乎无处不在,因为我的应用程序中至少有290个点使用了该函数。

我可能会建议我立即清理每个输入并使用它,以便我的函数调用类似于:

getfromtable("table_name",array("field1","field2",...),"something='value' and something2='".mysql_real_escape_string($_GET['INPUT'])."' and something3=\"".mysql_real_escape_string($_GET['INPUT2'])."\" and count=3");

但问题是我必须查找290次函数并查找要修复的变量,这很耗时。

我想要做的是在我的函数中,我想采取条件并检查SQL语句是否被正确转义并且如果不是则转义它。

这是我在php类中使用的函数,也是我几个月前创建的函数:

function getfromtable($tname,$tparams,$condition){
    unset($retres);$params="";
    foreach ($tparams as $n){$params=$params.$n.",";}    
    $params=substr($params,0,-1);// strip last comma to prevent SQL error
    if ($condition){$condition=" where ".$condition;}
    // $condition=???? //need to fix mysql injection attack
    $q=mysqli_query($this->conn,"SELECT ".$params." FROM ".$tname.$condition.";",MYSQLI_USE_RESULT);
    if (mysqli_error($this->conn)){echo "query error: ".mysqli_error($this->conn)."<br>";}else{$retres=$this->parsemultiple($q);}
    return $retres;
}

this->parsemultiple()仅生成查询结果,与问题无关。

我想过使用str_replace,但是我不知道如何处理这个问题,因为我用单引号中的字符串和双引号中的字符串只是使用mysqli_real_escape功能对整个字符串都没有意义或者用于打开和关闭字符串的引号将被视为文字,并且会导致mysql错误。

有没有办法可以在我的getfromtable函数中以编程方式执行此操作,我可以在mysqli_query调用之前添加一行或两行来格式化整个查询条件,这样就不会因用户输入错误而导致mysql注入?

0 个答案:

没有答案