【问题标题】:In Clause in mysql with sql injection在带有 sql 注入的 mysql 中的子句中
【发布时间】:2016-05-11 14:01:21
【问题描述】:

我在 PHP 中编写了一个 mysql 更新查询,防止 sql 注入:

UPDATE table1 status = 1 WHERE id IN ( ? ) and active = ?, array(implode(',' $ids), 1)

其中 id 字段为整数数据类型。

我在执行这个问题时遇到了问题,因为 implode 生成了一个逗号分隔的字符串,并且 id 没有用 IN 子句分配,因为它变成了:

array(implode(',' $ids) == array(1,2,3, 1)

前三个是 id,数组中的第四个值是活动字段值,但语句考虑数组中的前两个值(即 1,2)来替换“?”在查询中

注意:如果不使用防止sql注入作为相同查询,查询没有问题

UPDATE table1 SET status = 1 WHERE id IN ( 1,2,3 ) and active = 1

工作正常。仅与 PHP 内爆函数有关。

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    当专门将数组中的所有值强制转换为 int 时,您可以防止 sql 注入。这样就安全了。

    $intCastedIds = array_map('intval', $ids);
    

    如果您在 $ids 数组中注入代码,则 intval 会将所有值转换为 int。所以在这种特殊情况下是不可能注入的。

    所以而不是:

    UPDATE table1 status = 1 WHERE id IN ( ? ) and active = ?, array(implode(',' $ids), 1)
    

    做一些类似的事情:

    'UPDATE table1 status = 1 WHERE id IN (' . implode(',', $intCastedIds) . ') and active = ?', 1)
    

    【讨论】:

    • 您能否解释一下,因为我的问题是在更换时?使用实际值然后查询考虑四个值(活动字段的 3 个 id 和 1 个值),前两个 (1,2) 值替换为?
    • 非常感谢您的帮助,但仍然无法正常工作。
    • 我已经想到了解决方案,但想知道对于我所面临的情况有什么解决方案。感谢您的帮助
    【解决方案2】:

    使用准备好的语句!

    查看这篇文章,该文章详细介绍了如何仍然使用带有动态变量数量的预准备语句。

    http://www.pontikis.net/blog/dynamically-bind_param-array-mysqli

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 1970-01-01
      • 2015-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-14
      • 2022-01-06
      • 1970-01-01
      相关资源
      最近更新 更多