Подтвердить что ты не робот

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;
4b9b3361

Ответ 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..."