【发布时间】:2015-10-07 20:57:00
【问题描述】:
背景
我一直在从头开始开发内容管理系统。出于经验原因,它主要是从头开始开发的,但也将在以后使用。
我开发了一个 DatabaseManager 类,它扩展了 PHP 中的 mysqli 类。我正在使用它进行 MySQL 查询和连接。我开发的一个函数传递了 SQL 查询字符串(它是参数化的),后跟一个要替换的正确值的数组。
TL;DR
长话短说,我使用ReflectionClass 将参数绑定到SQL 查询并执行。我很好奇这是否是一种安全的方法,还是有另一种最适合的方法?
方法
这是DatabaseManager::do_query() 方法:
function do_query($sql, $values){
if(!isset($this->connect_error)){
$num_vals = count($values);
$i = 0;
$type = "";
while($i < $num_vals){
if(is_int($values[$i]) == true)
$type .= "i";
elseif(is_string($values[$i]) == true)
$type .= "s";
$i++;
}
$i = 0;
while($i < $num_vals){
$values2[$i] = &$values[$i];
$i++;
}
$values2 = array_merge(array($type), $values2);
$expr = $this->prepare($sql);
if($expr != false){
$ref = new ReflectionClass('mysqli_stmt');
$method = $ref->getMethod("bind_param");
$method->invokeArgs($expr, $values2);
$expr->execute();
return "Success";
}else{
$error_string = "Error: Query preparation resulted in an error. ";
$error_string .= $this->error;
__TGErrorHandler(TG_ERROR_DB_PREP);
return $error_string;
}
}
}
我通过测试没有遇到任何直接错误,而且它似乎可以抵抗 SQL 注入,使用准备好的语句。但是,这种方法的结构是否存在任何潜在问题?
附:我正在以不同的方式处理SELECT 语句。这将主要处理DELETE 和INSERT 语句。
【问题讨论】:
-
else{}我不明白你为什么拥有它。 -
我不确定我是否理解。 @EliasNicolas
-
if($expr != false){}执行返回,如果$exp为真,你返回一些东西,如果不是,你总是返回一些东西。您不需要else{}(仅表示else{}不是里面的东西)但是使用 PDO 更容易。
标签: php mysql class security mysqli