我试图通过$_POST
将mysqli_real_escape_string
全局变量直接传递给数据库而不进行任何处理......
这是我的代码工作正常。
class Db{
...
More
...
public function insert($args=array()){
if(!isset($args['table']) || !isset($args['values'])){
return false;
}
$table=$args['table'];
$values=$this->process_insert($args['values']);
$query="INSERT INTO {$table} {$values}";
$result=$this->query2db($query); //method returns mysqli_query()
if($result){
return true;
}else{
return false;
}
}
protected function process_insert($data=array()){
$values="";
$fields="";
$glue=", ";
if(isset($data)){
foreach($data as $key=> $value){
$key=$this->escape($key);
$value=$this->escape($value); //method returns mysqli_real_escape_string
$fields .="{$key}".$glue;
$values .="'{$value}'".$glue;
}
$fields=rtrim($fields, $glue);
$values=rtrim($values, $glue);
return "({$fields}) VALUES ({$values})";
}else{
return false;
}
}
...
More
...
}
if(!empty($_POST)){
$query=array(
'table'=>'users',
'values'=> $_POST //<=== WHAT COULD BE THE PROBLEM HERE
);
$dbObj=new Db;
$dbObj->insert($query);
}
UPDATE -
答案 0 :(得分:0)
我建议使用预准备语句,而不是使用mysql_real_escape_string。我总是说,永远不要相信用户输入。您的数据将被转义,但仍会进入您的数据库,并且不会忘记使用准备语句获得的性能提升!
答案 1 :(得分:0)
$key=$this->escape($key);
这里存在明显的漏洞。 mysqli_real_escape_string
转义 SQL字符串语法 。字段名称不使用字符串语法。简单的字符串转义示例意味着:
$value = "Craig O'Connor";
$query = "INSERT INTO ... VALUES ('$value')";
^^^^^^^^
'Craig O'Connor' -> syntax error
逃脱:
$value = "Craig O'Connor";
$value = mysqli_real_escape_string($con, $value);
$query = "INSERT INTO ... VALUES ('$value')";
^^^^^^^^
'Craig O\'Connor'
字符串转义机制转义了 您必须将允许的字段列入白名单,并根据该白名单对其进行过滤。您不能盲目接受任何和所有字段名称,只需按原样使用它们即可。不仅因为它介于很难和不可能转义字段名称之间,而且因为使用不存在的字段名称将导致查询错误。您不希望因用户输入拼凑错误而导致查询错误。 这就是说,首先不使用预先准备好的陈述,或者说你在数据库中给予用户或多或少的免费统治...... '
。假设先决条件,mysqli_real_escape_string
执行任何有用的操作是您将在SQL字符串文字中使用结果。使用字段名称,您不会这样做。因此,字符串转义在那里没有做任何事情。因此,您很容易受到SQL注入的攻击。</ p>