Уязвимость в SQL-инъекциях с подготовленным оператором, использующим конкатенацию - PullRequest
0 голосов
/ 29 августа 2018

Будет ли параметризованный код, который использует конкатенацию таким образом, уязвимостью SQL-инъекции? Я предполагаю, что это так, но я не уверен, какие данные POST будут использовать его.

        foreach ($_POST as $key => $value) {
          $columns .= ($columns == "") ? "" : ", ";
          $columns .= $key;
          $holders .= ($holders == "") ? "" : ", ";
          $holders .= ":".$value;
        }

        $sql = "INSERT INTO request ($columns) VALUES ($holders)";

        $stmt = $this->pdo->prepare($sql);

        foreach($_POST as $key => $value) {
          $field = ":".$key;
          $stmt->bindValue($field, $value);
        }

        $stmt->execute();

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

@ KetanYekale правильно, что вам нужно отфильтровать $ _POST для известных имен столбцов.

Вот альтернативный способ сделать это, используя некоторые встроенные функции PHP.

$request_columns = array('column1','column2');// all the columns of request table

# get a subset of $_POST, only those that have keys matching the known request columns
$post_only_columns = array_intersect_key(
  $_POST,
  array_flip($request_column)
);

# make sure columns are delimited like `name` in case they are SQL reserved words
$columns = implode(array_map(function ($col) { return "`$col`"; }, array_keys($post_only_columns), ', ';

# use ? positional holders, not named holders. it's easier in this case
$holders = implode(array_fill(1, count($post_only_columns), '?'), ', ');

$sql = "INSERT INTO request ($columns) VALUES ($holders)";

$stmt => $this->pdo->prepare($sql);

# no need to bindValue() or use a loop, just pass the values to execute()
$stmt->execute( array_values($post_only_columns) );

PHP имеет множество функций Array , которые вы можете использовать в различных сценариях, чтобы сделать ваш код быстрее и лаконичнее. Вы можете использовать эти функции, чтобы избежать написания некоторых типов кодов foreach.

0 голосов
/ 29 августа 2018

Вам нужен массив для хранения всех столбцов таблицы запросов и проверки наличия ключа записи в массиве.

PHP-код:

$request_columns = array('column1','column2');// all the columns of request table

foreach ($_POST as $key => $value) {
    if(in_array($key,$request_columns)){
          $columns .= ($columns == "") ? "" : ", ";
          $columns .= $key;
          $holders .= ($holders == "") ? "" : ", ";
          $holders .= ":".$key;
     }
}

$sql = "INSERT INTO request ($columns) VALUES ($holders)";

$stmt = $this->pdo->prepare($sql);

foreach($_POST as $key => $value) {
  if(in_array($key,$request_columns)){
      $field = ":".$key;
      $stmt->bindValue($field, $value);
   }
}

$stmt->execute();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...