SQLite Parameters - Не разрешать tablename как параметр
Я разрабатываю приложение в AIR через Flex, но я не вижу, где я ошибаюсь в SQLite (я привык к MySQL). Параметры работают, но только в определенных случаях. Является ли эта часть встроенной системы санитарии против внедрения sql? Спасибо за любую помощь!
Работает:
SQLite
"INSERT: Поля из категории", где параметр: Fields = "*"
AS3
var statement:SQLStatement = new SQLStatement();
statement.connection = connection;
statement.text = "INSERT :Fields FROM Category";
statement.parameters[":Fields"] = "*";
statement.execute;
Не работает (синтаксическая ошибка SQL в ": Таблица" ):
SQLite
"INSERT: Fields FROM: Table", где указаны следующие параметры: Fields = "*" и: Table = "Category"
AS3
var statement:SQLStatement = new SQLStatement();
statement.connection = connection;
statement.text = "INSERT :Fields FROM :Table";
statement.parameters[":Fields"] = "*";
statement.parameters[":Table"] = "Category";
statement.execute;
Ответы
Ответ 1
Как правило, нельзя использовать SQL-параметры/заполнители для идентификаторов базы данных (таблицы, столбцы, представления, схемы и т.д.) или функции базы данных (например, CURRENT_DATE
), но вместо этого только для привязки значений литерала.
С поддержкой на стороне сервера для параметризованных (ака готовых) операторов, механизм БД анализирует ваш запрос один раз, запоминая особенности любых параметров - их типы, максимальные длины, префиксы и т.д. - которые вы свяжете в последующие исполнения уже обработанного запроса. Но запрос не может быть правильно проанализирован в его синтаксические элементы, если критические биты, такие как объекты базы данных, неизвестны.
Итак, обычно нужно подставить имена таблиц в хранимой процедуре или в клиентском коде, который динамически конкатцирует/интерполирует/отменяет корректное выполнение инструкции SQL. В любом случае, пожалуйста, не забудьте использовать функцию SQL API для цитирования идентификаторов базы данных, так как API не сделает это за вас.
Ответ 2
Не уверен, что это то же самое, но я наткнулся на что-то подобное на Java. В принципе, вы не можете добавить таблицу в качестве параметра, поэтому вы должны сгенерировать оператор следующим образом:
var statement:SQLStatement = new SQLStatement();
statement.connection = connection;
statement.text = stringUtil.substitute("INSERT :Fields FROM {0}", "Category");
statement.parameters[":Fields"] = "*";
statement.execute;
Это скорее всего не самое безопасное решение, поэтому вам может потребоваться некоторая выборочная проверка данных перед добавлением имени таблицы.. так что кто-то не пытается отправить ему имя таблицы "; drop tableName..."