0

私のアプリケーション (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
4

2 に答える 2

2

複数の挿入を行うと、MySQL インジェクションの脆弱性に影響があるかどうか疑問に思っていましたか? PHPコードを使用してクエリを「構築」するためです。

実際には、手動でクエリを作成することは避けられないため、1 つまたは 2 つのクエリを動的に作成しても問題ありません。この場合に従う必要がある唯一の規則は、すべてのクエリ部分をスクリプトにハードコーディングする必要があるということです。

それに従う限り、注射は不可能です。

あなたの場合、すべてのクエリ部分がハードコードされているため、このコードは安全です。

于 2016-04-14T11:16:19.557 に答える
1

これらの値が PDO パラメーター化されたクエリによって処理されている限り、試行されたインジェクションは回避されます。

https://stackoverflow.com/a/134138

PDO を使用していない場合は、すべてのデータが正しくエスケープされていることを確認する必要がありますが、これは大変な作業です。

MySQL サーバーによって実際に実行されたクエリを確認するには、次の手順に従って一般的なログを設定します: https://stackoverflow.com/a/2413308

于 2016-04-14T10:51:16.703 に答える