【发布时间】: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