如果在WHERE子句中使用数组元素,是否可以防止SQL注入?

时间:2014-12-01 01:24:07

标签: php mysqli sql-injection

我终于想出了如何使用数组元素作为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 Lian) 它并不重要,但$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'] );
}

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

2 个答案:

答案 0 :(得分:1)

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

从PHP文档开始:

  

准备好的陈述的参数不需要引用;驱动程序自动处理这个。如果应用程序专门使用预准备语句,开发人员可以确保不会发生SQL注入(但是,如果使用非转义输入构建查询的其他部分,仍然可以进行SQL注入)。

其余documentation

答案 1 :(得分:0)

不幸的是,如果$array中的任何内容来自您在WHERE IN ()语句中使用的任何形式的请求输入,则不会受到SQL注入的保护。有关如何正确绑定IN条件的参数,请参阅Can I bind an array to an IN() condition?