PHP、PDO、MySQL-多个INSERT易被注入


PHP, PDO, MySQL - Multiple INSERT vulnerable to injection?

在我的应用程序(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

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

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

只要坚持下去,就不可能注射。

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

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

https://stackoverflow.com/a/134138

如果你没有使用PDO,那么你需要确保所有数据都被正确地转义,这是一项艰巨的工作。

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