【问题标题】:Sanitising user input with Medoo使用 Medoo 清理用户输入
【发布时间】:2013-11-17 23:40:59
【问题描述】:

Medoo 是一个 PHP 数据库框架。有谁知道我是否需要在使用 insert() 函数之前清理用户输入?在主页 (http://medoo.in/) 下的“为什么选择 medoo?”部分然后它只是说“防止 SQL 注入”,但我不知道这是否意味着它为你做,或者这样做更容易。

有人知道吗?我似乎更有可能为你做到这一点,但我宁愿确定。

【问题讨论】:

    标签: php mysql database frameworks sanitization


    【解决方案1】:

    默认情况下,1.6.1 版本似乎没有转义。

    $database = new Medoo([
        "database_type" => "mysql",
        "database_name" => "database",
        "server" => "localhost",
        "username" => "user",
        "password" => "1234",
        "charset" => "utf8"
    ]);
    
    
    // Original proper query and injection
    
    $table_proper_plain = 'TAB_1';
    $table_inject_plain = 'TAB_1" UNION SELECT username, password FROM TAB_2;#';
    
    $database->select($table_proper_plain, ["COL_1","COL_2"]);
    // SELECT `COL_1`,`COL_2` FROM `TAB_1`
    // valid, returns rows from TAB_1
    // works as expected
    
    $database->select($table_inject_plain, ["COL_1","COL_2"]);
    // SELECT `COL_1`,`COL_2` FROM `TAB_1` UNION SELECT username, password FROM TAB_2;#"
    // valid(!), returns rows from TAB_1 AND TAB_2(!)
    // bad, injection successful
    
    
    // Using method quote on proper and injection query
    
    $table_proper_quote = $database->quote($table_proper_plain);
    $table_inject_quote = $database->quote($table_inject_plain);
    
    $database->select($table_proper_quote, ["COL_1","COL_2"]);
    // SELECT `COL_1`,`COL_2` FROM "'TAB_1'"
    // not valid, error 1146: Table 'database.'TAB_1'' doesn't exist
    // bad, quoting broke query
    
    $database->select($table_inject_quote, ["COL_1","COL_2"]);
    // SELECT `COL_1`,`COL_2` FROM "'TAB_1\" UNION SELECT username, password FROM TAB_2;#'"
    // not valid, error 1146: Table 'database.'TAB_1'' doesn't exist
    // good, injection not successful
    

    【讨论】:

      【解决方案2】:

      Medoo 放弃了对 PDO prepare 的支持,因为 prepare 的引用过程对当前的序列化数组数据不好,并且存在一些兼容问题。

      不过,如果你喜欢http://medoo.in/api/pdo,你可以使用它

      $calories = 150;
      $colour = 'red';
      
      $sth = $database->pdo->prepare('SELECT name, colour, calories
          FROM fruit
          WHERE calories < :calories AND colour = :colour');
      
      $sth->bindParam(':calories', $calories, PDO::PARAM_INT);
      $sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
      
      $sth->execute();
      

      【讨论】:

        【解决方案3】:

        实际上,查看代码,他们似乎没有使用 PDO 准备方法来构建他们的代码,这意味着即使使用引号,也可能使用奇怪的宽字符进行破解。见https://security.stackexchange.com/questions/9908/multibyte-character-exploits-php-mysql

        【讨论】:

        【解决方案4】:

        快速查看代码,该类基本上是多个数据库类型的CRUD

        他们使用quote() 方法来转义用户输入。

        虽然 PHP 建议

        如果您使用 quote() 构建 SQL 语句,强烈建议您使用 PDO::prepare() 来 准备带有绑定参数的 SQL 语句,而不是使用 PDO::quote() 将用户输入插入到 SQL 语句中。准备好的 带有绑定参数的语句不仅更便携,更 方便,不受 SQL 注入影响,但通常更快 执行比插值查询,作为服务器和客户端 可以缓存查询的编译形式。

        【讨论】:

          【解决方案5】:

          似乎他们正在过滤掉 SQL 注入,您不必担心。 [他们已将其列为他们的主要功能之一]

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-09-14
            • 1970-01-01
            • 1970-01-01
            • 2012-10-02
            • 2014-09-08
            • 1970-01-01
            • 1970-01-01
            • 2021-12-07
            相关资源
            最近更新 更多