PHP、PDO、MySQL - 多个 INSERT 容易被注入? [复制]

Posted

技术标签:

【中文标题】PHP、PDO、MySQL - 多个 INSERT 容易被注入? [复制]【英文标题】:PHP, PDO, MySQL - Multiple INSERT vulnerable to injection? [duplicate] 【发布时间】:2016-08-05 18:28:15 【问题描述】:

在我的应用程序 (php) 中,我将从 API 请求大约 3000 行,并使用 PDO 驱动程序将它们插入 mysql 表中。

虽然要插入的数据不是用户输入的,但如何将数据交给我却不在我的掌控之中。

因为大约 3000 次插入尽可能快很重要,所以我想使用像 (?,?,?),(?,?,?),... 这样的多次插入。

我想知道进行多次插入是否会对 MySQL 注入的漏洞产生影响?因为我使用 PHP 代码“构建”查询。

我的“测试”代码是:

<?php

    class DBCon 
        private static $instance = null;
        private $db;

        private function __construct() 
            $this->db = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', 'root', '');
            $this->db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
            $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        

        public static function getDB() 
            if (self::$instance === null) 
                self::$instance = new self();
            
            return self::$instance->db;
        
    

    function createItems($array) 
        $sql = 'INSERT INTO `table`(`text`, `int`, `bool`) VALUES ';

        $insertArray = array();
        foreach ($array as $arrayItem) 
            $sql .= '(';
            foreach ($arrayItem as $arrayItemItem) 
                array_push($insertArray, $arrayItemItem);
                $sql .= '?,';
            
            $sql = rtrim($sql, ',');
            $sql .= '),';
        
        $sql = rtrim($sql, ',');

        var_dump($sql);
        var_dump($insertArray);

        try 
            $query = DBCon::getDB()->prepare($sql);
            $query->execute($insertArray);
         catch (PDOException $e) 
            echo '<br/><br/>query failure';
        
    

    $array = array(array('a piece of text',123,0),array('a piece of text',123,0));

    createItems($array);

$sql 包含:

index.php:36:string 'INSERT INTO `table`(`text`, `int`, `bool`) VALUES (?,?,?),(?,?,?)' (length=65)

$insertArray 包含:

index.php:37:
array (size=6)
  0 => string 'a piece of text' (length=15)
  1 => int 123
  2 => int 0
  3 => string 'a piece of text' (length=15)
  4 => int 123
  5 => int 0

【问题讨论】:

顺便说一句,您不应该捕获错误来报告它们。相反,让 PHP 来处理它。换句话说,只需摆脱 try catch。 【参考方案1】:

只要 PDO 参数化查询正在处理这些值,它就会逃避任何尝试的注入。

https://***.com/a/134138

如果您不使用 PDO,那么您需要确保所有数据都正确转义,这是很多工作。

要查看 MySQL 服务器实际执行的查询,您可以按照以下说明设置常规日志: https://***.com/a/2413308

【讨论】:

这不能回答所提出的问题。 我想是的。您正在使用参数化查询,所以应该没问题。但是,如果您想了解您的查询发生了什么,您可以查看我包含的第二个链接。【参考方案2】:

我想知道进行多次插入是否会对 MySQL 注入的漏洞产生影响?因为我使用 PHP 代码“构建”查询。

好吧,在现实生活中,我们无法避免手动构建查询,因此可以动态创建一两个查询。在这种情况下,您必须遵循的唯一规则是所有查询部分都必须在您的脚本中进行硬编码

只要遵循它,就永远不可能进行注射。

在您的情况下,所有查询部分都是硬编码的,因此此代码是安全的。

【讨论】:

有趣,我以为我就是这么说的。

以上是关于PHP、PDO、MySQL - 多个 INSERT 容易被注入? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

PDO / PHP / MySQL 中的性能:事务与直接执行

PHP/PDO/MySQL:将多个查询转换为单个查询

php PHP PDO INSERT

MySQL与PDO [重复]

SQL Server 错误 1934 发生在 INSERT 到具有计算列 PHP/PDO 的表中

PHP PDO 检查 mySQL 表中的多个列并创建不存在的列