如果 WHERE 子句中使用数组元素,则防止 SQL 注入


Protected against SQL injection if array elements used in WHERE clause?

我终于弄清楚了如何使用数组元素作为 WHERE 子句的一部分,但现在我不确定以下查询是否受到 SQL 注入保护。

$elements = ( implode ( "', '", $array ) );
if ( $stmt = $mysqli -> prepare ( "SELECT * FROM config_errors WHERE error_assoc_id IN ('$elements') AND row_type = ?" ) ) {
  $row_type = "some_value";
  $stmt -> bind_param ( "s", $row_type );
  ...
}

老实说,我在这方面非常缺乏。感谢您的任何建议。


编辑(@Wing连)这不是重要的事情,但$array是在另一个语句中创建的:

$array = array();
if ( $stmt = $mysqli -> prepare ( "SELECT * FROM config_errors WHERE row_type = ? AND error_type = ?" ) ) {
  bind params
  execution of the query and the result
  mysqli_num_rows condition
  while $row loop
  value (characters) conditions
  array_push ( $array, $row['value'] );
}

假设数组是从某种形式的输入创建的。

由于您使用的是 prepare 语句,因此您的应用程序将受到 SQL 注入保护。

截至 PHP 文档:

预准备语句的参数不需要用引号引起来;驱动程序会自动处理此问题。如果应用程序只使用预准备语句,开发人员可以确保不会发生 SQL 注入(但是,如果使用未转义的输入构建查询的其他部分,则仍然可以进行 SQL 注入)。

文档的其余部分

不幸的是,

如果$array中的任何内容来自您在 WHERE IN () 语句中使用的任何形式的请求输入,则无法防止 SQL 注入。请参阅我可以将数组绑定到 IN() 条件吗?关于如何正确绑定 IN 条件的参数。