我使用的是PHP 7,MySQL。我已经为我的项目编写了很长时间,现在有数以千计的MySQL查询。那时我不知道准备好的陈述。
现在,为了避免SQL注入,我想使用预处理语句,但我很难将它们全部逐个转换为预处理语句。
有什么方法可以解析一个普通语句并使用PHP自动将其转换为预处理语句?对于每个MySQL查询,我都会在传递给MySQL命令之前将其传递给PHP函数。
public function dbquery($query,$dbname,$dbclose="-1")
{
$this->mysqli->select_db($dbname);
$GLOBALS["dbr_total"]++;$GLOBALS["dbr_query"]++;
$colarr=Array();$tares=Array();
if ($result = $this->mysqli->query($query))
{
$GLOBALS["dbretry"]=0;
$finfo = $result->fetch_fields();
$c=0;
foreach ($finfo as $val)
{
$colarr[$c]=$val->name;//get all colum names in this array
$c++;
}
$co=0;
while($obj = $result->fetch_object())
{
for($k=0;$k<count($colarr);$k++)
{
$elem=$colarr[$k];
$tares[$co][$elem]=$obj->{$colarr[$k]};
}
$co++;
}
if($co==0)
{
$GLOBALS["dbretry"]=0;
if($dbclose!="-1"){$this->dbclose();}
return EMPTY_RESULT;
}
}
else
{
if($GLOBALS["dbretry"]>3)
{
$GLOBALS["dbretry"]=0;
$errmsg=$this->mysqli->error;
$errno=$this->mysqli->errno;
if($dbclose!="-1"){$this->dbclose();}
$errobj=new ta_errorhandle();
$errobj->senderror("OOPS! Could Not process your query!".$errmsg,$errno,"1");
}
else
{
$GLOBALS["dbretry"]++;
$this->dbquery($query,$dbname);
}
}
//QUERY DONE
if($dbclose!="-1"){$this->dbclose();$result->close();}
unset($obj);unset($finfo);unset($query);unset($result);unset($colarr);unset($c);unset($co);
return $tares;
}
public function dbinsert($query,$dbname,$dbclose="-1")
{
$this->mysqli->select_db($dbname);
$GLOBALS["dbr_total"]++;;$GLOBALS["dbr_insert"]++;
if (!$this->mysqli->query($query))
{
$errmsg=$this->mysqli->error;
$errno=$this->mysqli->errno;
die("<br><br>".$errmsg."<br><br>".$errno);
if($GLOBALS["dbretry"]>3)
{
$GLOBALS["dbretry"]=0;
$logobj=new ta_logs();
$logobj->store_templogs("PROBLEM EXECUTING QUERY:".$query." ON ".$dbname);
return $this->mysqli;
}
else
{
$GLOBALS["dbretry"]++;
$this->dbinsert($query,$dbname);
}
}
else
{
$GLOBALS["dbretry"]=0;
}
if($dbclose!="-1"){$this->dbclose();}
return SUCCESS;
}
现在我所做的就是调用$dbobj->dbquery("my query","database name");
,其中$ dbobj是这些函数类的对象。
如何转换这些函数,以便使用我作为参数接收的任何查询并将其转换为预处理语句?我无法重写代码中的每个查询。我已经写了超过10,000个查询。
答案 0 :(得分:0)
问题是您似乎将整个查询作为字符串传递给dbquery()
方法。
预准备语句仅在将值作为参数传递给查询时防止sql注入,而不是在查询中已经存在该值时。
由于您的整个查询都是单个字符串,没有占位符且没有单独传递值,因此您无法使用预准备语句来防止sql注入,而无需更改将查询和参数传递给dbquery()
方法的方式。因此,如果要利用预准备语句的sql预防功能,则需要重写查询。