【问题标题】:Protected against SQL injection if array elements used in WHERE clause? [duplicate]如果在 WHERE 子句中使用数组元素,是否可以防止 SQL 注入? [复制]
【发布时间】:2014-12-01 01:24:07
【问题描述】:

我终于知道如何将数组元素用作 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'] );
}

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

【问题讨论】:

  • Prepare 语句和 bind_param 将保护您免受 SQL 注入。所以你很好:)
  • 不,不是。您可以重新发明轮子,也可以使用任何体面的实现数组绑定的包装类。最快的解决方法是array_map([$pdo, "quote"], $array)。但是您使用的是mysqli。慰问。
  • @TheLittleHawk 您好,感谢您的回复!你确定我很好?因为bind_param函数没有应用于$elements变量...
  • @mario 感谢您的慰问。
  • 阅读“二阶注射”。肤浅的“准备好的陈述就足够了”的答案与事实相去甚远。

标签: php mysqli sql-injection


【解决方案1】:

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

截至 PHP 文档:

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

documentation的其余部分

【讨论】:

  • 所以不需要引用语句的参数。看来你是对的。非常感谢,也给链接! ☺
  • OP 示例中的 IN 值未包含在准备好的语句中。它们没有被绑定为参数,而只是插值。即使这些值来自先前的数据库查询,它们也可以包含 SQL 字符串附件,因此数据可能会渗入下游操作的代码上下文中。
【解决方案2】:

很遗憾,如果 $array 中的任何内容来自您在 WHERE IN () 语句中使用的任何形式的请求输入,那么您将无法防止 SQL 注入。请参阅Can I bind an array to an IN() condition?,了解如何正确绑定 IN 条件的参数。

【讨论】:

  • 您好,请查看问题的编辑,也感谢您的参考。
猜你喜欢
  • 2013-02-25
  • 2012-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
相关资源
最近更新 更多