Есть ли что-то, что может избежать санитарии в моем сценарии или это безопасно от most SQL-инъекции? Как я понимаю, если вы передаете запрос в качестве подготовленного аргумента, неважно, как был создан запрос, правильно?Является ли это создание динамического SQL-запроса безопасным от инъекций?
Edit2: Я редактировал код, чтобы отразить предложения связывания значений по $ _POST
$q = $pdo->prepare('SHOW COLUMNS FROM my_table');
$q->execute();
$data = $q->fetchAll(PDO::FETCH_ASSOC);
$key = array();
foreach ($data as $word){
array_push($key,$word['Field']);
}
$sqlSub= "INSERT INTO other_table(";
$n = 0;
foreach ($key as $index){
$sqlSub = $sqlSub.$index.", ";
$n = $n + 1;
}
$sqlSub = $sqlSub.") VALUES (";
for ($i=1; $i<$n;$i++){
$sqlSub = $sqlSub."?, ";
}
$sqlSub = $sqlSub.."?)";
$keyValues = array();
for($i=0;i<n;$i++){
array_push($keyValues,$_POST[$key[$i]]);
}
$q->$pdo->prepare($sqlSub);
q->execute($keyValues);
EDIT: Это, как окончательный запрос выглядит как после предложенных правок
INSERT INTO other_table($key[0],...,$key[n]) VALUES (?,...,nth-?);
'если вы передаете запрос в качестве подготовленного аргумента, неважно, как был создан запрос' ... неправильно. Да, это все еще уязвимо. На самом деле, вы так же уязвимы, как если бы вы не подготовили запрос. Способ сделать это безопасным для SQL-инъекции - это не просто подготовить ваш запрос, а подготовить запрос к заполнителям и привязать значения к этим заполнителям. –
Нет! Если вы не используете привязку своих значений, вы небезопасны. – aynber
no, если вы хотите сделать это безопасным, получите список столбцов в таблице, используя ключи «Описать» или «Объяснить», можно изменить, если они, например, являются именами входных данных формы, со списком столбцов, которые вы может перекрестно проверить их. Затем используйте подготовленные инструкции для значений и белый список для ключей. – ArtisticPhoenix