【发布时间】:2021-12-10 00:09:55
【问题描述】:
我正在更新几个包含易受攻击的 mysql 查询的 php 文件。我的任务当然是合并准备好的语句和参数绑定。但是,我无法找到将以下类型的查询转换为准备好的语句的最佳方法。
'UPDATE `client_media` SET folder ="' . $folder_name . '" WHERE id IN ('.$media_ids.') LIMIT ' . $assetCount;
如果它只是要绑定的数组,这会容易得多,但是由于数组之后的限制条件,我遇到了困难,并且在解压缩参数之后应用时会导致问题。
$stmt = $db->prepare($sql);
$types = 's' . str_repeat('i', count($media_ids)) . 'i';
$stmt->bind_param($types, $folder, ...$media_ids, $assetCount);
$stmt->execute();
有什么提示或想法吗?
编辑: @Progman 谢谢,但该问题假定唯一的参数是数组。我说的是在数组之前和之后准备一个(或多个)多个参数。
【问题讨论】:
-
不要仅仅因为查询没有使用绑定变量就认为它是易受攻击的。考虑数据的来源。
$media_ids看起来像是来自不同查询的输出,因此请考虑此处是否适合使用 JOIN 或子查询。$assetCount来自哪里?如果你的代码中有一行设置了它,你可以信任数据,你可以在准备查询之前连接它。 -
@TangentiallyPerpendicular 非常好,但不幸的是这些值是通过请求提供的。不幸的是,我只收到了这些包含查询的文件,所以我看不到调用方发生了什么。现在我最终只是循环遍历 media_ids 数组并查询每个项目并收集错误。可能不是最好的方法。
-
@Progman 谢谢,但该问题假定唯一的参数是数组。我说的是在数组之前和之后准备一个(或多个)多个参数。
标签: php mysqli prepared-statement