无覆盖的 SQL 注入


Sql injection without overwrite

我有一个php脚本,可以填充sql数据库中的表。问题是每次我运行它时它都会覆盖表,我只想在最后添加数据。我从我修改的现有脚本中获得了灵感,但我不了解它包含的所有内容。

这是我的代码:

<?php
  try {
    session_start();
    require_once('./lib/demo/php/functions.php');
    $db = getConnection();
    $colMap = array(
      0 => "LIBELLE",
      1 => "DESCRIPTION",
      2 => "CODE"
    );
    if (isset($_GET['data']) && $_GET['data']) {
      $select = $db -> prepare('DELETE FROM COMPETENCES');
      $select2 = $db -> prepare('DELETE FROM DESCRIPTION');
      $select -> execute();
      $select2 -> execute();
      for ($r = 0, $rlen = count($_GET['data']); $r < $rlen; $r++) {
        $rowId = $r + 1;
        for ($c = 0, $clen = count($_GET['data'][$r]); $c < $clen; $c++) {
          if (!isset($colMap[$c]) && !isset($colMap[$c])) {
            continue;
          }
          $newVal = $_GET['data'][$r][$c];
          $select = $db -> prepare('SELECT ID FROM COMPETENCES WHERE ID=? LIMIT 1');
          $select2 = $db -> prepare('SELECT ID FROM DESCRIPTION WHERE ID=? LIMIT 1');
          $select -> execute(array($rowId));
          $select2 -> execute(array($rowId));
          if ($row = $select->fetch() && $row = $select2->fetch()) {
            $query = $db->prepare('UPDATE COMPETENCES SET `' . $colMap[$c] . '` = :newVal WHERE ID = :id');
            $query2 = $db->prepare('UPDATE DESCRIPTION SET `' . $colMap[$c] . '` = :newVal2 WHERE ID = :id2');
          } else {
            $query = $db->prepare('INSERT INTO COMPETENCES (ID, `' . $colMap[$c] . '`) VALUES(:id, :newVal)');
            $query2 = $db->prepare('INSERT INTO DESCRIPTION (ID, `' . $colMap[$c] . '`) VALUES(:id2, :newVal2)');
          }
          $query->bindValue(':id', $rowId, PDO::PARAM_INT);
          $query2->bindValue(':id2', $rowId, PDO::PARAM_INT);
          $query->bindValue(':newVal', $newVal, PDO::PARAM_STR);
          $query2->bindValue(':newVal2', $newVal, PDO::PARAM_STR);
          $query->execute();
          $query2->execute();
        }
      }
    }
    $out = array(
      'result' => 'ok'
    );
    echo json_encode($out);
    closeConnection($db);
  }
  catch (PDOException $e) {
    print 'Exception : ' . $e->getMessage();
  }
?>
}

我认为删除DELETE查询可以解决问题,但脚本根本不起作用。我认为问题来自 ids,但我找不到在哪里。

数据取自使用 javascript 插件创建的网格 Handsontable .

你能帮我吗?我真的需要这个脚本。

我的脚本仍然不起作用,但我删除了所有我认为无用的东西。现在,即使新代码看起来更合适,数据库中也没有任何反应。

这是新的:

<?php
  try {
   session_start();
   require_once('./lib/demo/php/functions.php');
   $db = getConnection();
   mysql_set_charset('utf8', $db);
   $colMap = array(
       0 => 'LIBELLE',
       1 => 'DESCRIPTION',
       2 => 'CODE'
   );
   if (isset($_GET['data']) && $_GET['data']) {

       for ($r = 0, $rlen = count($_GET['data']); $r < $rlen; $r++) {
           $rowId = $r + 1;
           for ($c = 0, $clen = count($_GET['data'][$r]); $c < $clen; $c++){
               if (!isset($colMap[$c])) {
                   continue;
               }
               $newVal = $_GET['data'][$r][$c];
               $query = $db->prepare('INSERT INTO COMPETENCES ("'.$colMap[$c].'") VALUES(:newVal)');
               $query2 = $db->prepare('INSERT INTO DESCRIPTION ("'.$colMap[$c].'") VALUES(:newVal2)');
               $query->bindValue(':newVal', $newVal, PDO::PARAM_STR);
               $query2->bindValue(':newVal2', $newVal, PDO::PARAM_STR);
               $query->execute();
               $query2->execute();
           }
       }
   }
   $out = array('result' => 'ok');
   echo json_encode($out);
   closeConnection($db);
}
catch (PDOException $e) {
    print 'Exception : ' . $e->getMessage();
}
?>