2016-04-14 36 views
0

Uygulamamda (PHP) bir API'den ~ 3000 satır talep edip bunları PDO sürücüsünü kullanarak bir MySQL tablosuna yerleştireceğim.PHP, PDO, MySQL - Çoklu INSERT enjeksiyona karşı hassas mı?

Eklenecek veriler kullanıcı girişi olmamasına rağmen, verilerimin bana nasıl verildiği elimden çıkar.

~ 3000 kesici uçların olabildiğince hızlı gitmesi önemlidir, bu yüzden (?,?,?),(?,?,?),... gibi çoklu bir ek kullanmak istiyorum.

Birden çok ekleme yapmanın MySQL enjeksiyonunun güvenlik açığı üzerinde bir etkisi olup olmadığını merak ediyordum? Çünkü PHP kodunu kullanarak sorguyu yapıyorum.

Benim 'test' kod şudur:

<?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 içerir:

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

$insertArray içerir:

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, bunları raporlamak için hata yakalamamalısınız. Bunun yerine, PHP'nin bunu ele almasına izin verin. Diğer bir deyişle, sadece yakalamayı deneyin. –

cevap

2

bir MySQL enjeksiyonu? Çünkü PHP kodunu kullanarak sorguyu yapıyorum.

Peki, gerçek hayatta, el ile sorgu oluşturma işleminden kaçınamıyoruz, bu nedenle, bir sorgu veya iki dinamik olarak oluşturma hakkı vardır. Bu durumda izlemeniz gereken tek kural, şeklindedir. Tüm sorgu bölümleri komut dosyanızda kodlanmış olmalıdır.

Takip edildiği sürece, hiçbir enjeksiyon mümkün olmayacaktır. Sizin durumunuzda tüm sorgu parçaları kodlanır, bu nedenle bu kod güvenlidir.

+0

Komik, Ben söylediklerimi düşündüm. –

1

sürece bu değerler PDO tarafından işlenirken olarak parametreli sorguları Daha sonra, herhangi bir girişimi olan enjeksiyonlardan kaçacaktır. PDO kullanmıyorsanız

https://stackoverflow.com/a/134138

, o zaman emin tüm veri bir sürü iş olduğu kaçan doğru olduğunu yapmak gerekir.

aslında MySQL sunucusu tarafından infaz edildi neyi sorgu, genel günlüğünü kurmak için aşağıdaki yönergeleri takip edebilirsiniz görmek için: Bir çoklu insert yapmak için açığı üzerindeki etkisinin olup olmadığı merak https://stackoverflow.com/a/2413308

+0

Bu, sorulan soruya cevap vermiyor. –

+0

Bunu yaptığını düşündüm. Parametreli bir sorgu kullanıyorsunuz, bu yüzden iyi olmalısınız. Ancak, sorgunuzda ne olduğunu görmek isterseniz, dahil ettiğim ikinci bağlantıya bakabilirsiniz. –