【问题标题】:Is it possible to perform an SQL Injection attack where the malicious SQL is stored in a database table?是否可以执行 SQL 注入攻击,其中恶意 SQL 存储在数据库表中?
【发布时间】:2014-05-10 00:10:10
【问题描述】:

我正在努力确保正确地防止 SQL 注入。

如果我有一个包含列 C1 的 MySQL 表 T1,并且存储在 C1 中的一行的值是一些 SQL,是否有任何可以存储的 SQL 可以在选择时执行?

如果它包含“SELECT * FROM T2”,那么选择 C1 只会返回那个 SQL 字符串,但我只是想知道是否有任何方法可以执行存储的 SQL?

我不想将来自用户的未经验证的数据存储在 db 表中,这样当我选择它时,期望它是 First Name 或类似的东西,它会执行一些恶意 SQL。

谢谢,

保罗

【问题讨论】:

    标签: mysql security sql-injection


    【解决方案1】:

    被选中时会执行吗?

    没有。

    【讨论】:

      【解决方案2】:

      被选中时会执行吗?

      不,如果您所做的只是选择内容,则不会。

      只有在随后以不安全的方式将 SQL 复制到另一个字符串中并将该字符串作为查询执行时,才能执行该 SQL。

      例如:

      $sql1 = "SELECT name FROM users";
      $name = $pdo->query($sql1)->fetchColumn();
      
      // the following is unsafe:
      $sql2 = "SELECT * FROM user_activity WHERE user_name = '$name'";
      $stmt = $pdo->query($sql2);
      

      这称为“二阶 SQL 注入”,并不少见。该修复与 SQL 查询中的任何其他动态值相同:使用查询参数。

      $sql2 = "SELECT * FROM user_activity WHERE user_name = ?";
      $stmt = $pdo->prepare($sql2);
      $stmt->execute(array($name));
      

      【讨论】:

        猜你喜欢
        • 2016-11-05
        • 1970-01-01
        • 2015-04-23
        • 2021-08-07
        • 2011-03-27
        • 1970-01-01
        • 2015-11-30
        • 2013-09-21
        • 1970-01-01
        相关资源
        最近更新 更多