【问题标题】:Preparing MySQL statements that involve arrays and other parameters准备涉及数组和其他参数的 MySQL 语句
【发布时间】: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


【解决方案1】:

你有两个选择。

  1. 将值追加到bind_param()之前的数组:

    $stmt = $db->prepare($sql);
    $media_id[] = $assetCount;
    $types = 's' . str_repeat('i', count($media_ids));
    $stmt->bind_param($types, $folder, ...$media_ids);
    $stmt->execute();
    
  2. 创建一个数组,然后再次 splat:

    $stmt = $db->prepare($sql);
    $types = 's' . str_repeat('i', count($media_ids)) . 'i';
    $stmt->bind_param($types, ...[$folder, ...$media_ids, $assetCount]);
    $stmt->execute();
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    相关资源
    最近更新 更多