2016-04-14 28 views
0

私のアプリケーション(PHP)では、APIから約3000行をリクエストし、PDOドライバを使用してこれらをMySQLテーブルに挿入します。PHP、PDO、MySQL - 複数のINSERTがインジェクションに脆弱ですか?

挿入するデータはユーザーの入力ではありませんが、データがどのように私に渡されるのかは私の手元にありません。

〜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 
+0

Btw、エラーを報告して報告する必要はありません。代わりに、PHPがそれを処理するようにしてください。つまり、try catchを取り除くだけです。 –

答えて

2

私は複数の挿入を行うことのための脆弱性に影響があるかどうかを疑問に思いましたMySQLの注射?なぜなら私はPHPコードを使ってクエリをビルドしているからです。

実際の生活では、手動でのクエリ構築を避けることはできません。したがって、クエリを2つまたは動的に作成することは大丈夫です。このケースで従わなければならない唯一のルールはです。すべてのクエリ部分をスクリプトにハードコードする必要があります。

それが続く限り、注射はこれまで可能ではありません。

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

+0

面白い、私はそれが私が言ったことだと思った。 –

1

限りこれらの値は、PDOパラメータ化クエリによって処理されているように試行された注射から逃れる。

https://stackoverflow.com/a/134138

あなたはPDOを使用していない場合は、すべてのデータは、多くの仕事である、正しくエスケープされていることを確認する必要があります。実際にMySQLサーバーで実行されたものをクエリ、あなたはこれらの命令は、一般的なログを設定するために従うことができます表示するには

https://stackoverflow.com/a/2413308

+0

これは質問された質問に答えません。 –

+0

そう思った。パラメータ化されたクエリを使用しているので、うまくいくはずです。しかし、あなたの質問で何が起こったのかを見たい場合は、私が含んでいた2番目のリンクを見ることができます。 –

関連する問題