12 Stimmen

SQLite Parameter - Tabellenname als Parameter nicht erlaubt

Ich entwickle eine Anwendung in AIR über Flex, aber ich verstehe nicht, was ich mit SQLite falsch mache (ich bin an MySQL gewöhnt). Die Parameter funktionieren, aber nur in bestimmten Fällen. Ist dies Teil des eingebauten Sanierungssystems gegen SQL-Injection? Vielen Dank für jede Hilfe!

Werke:

sqlite

"INSERT :Fields FROM Category", wobei der Parameter :Fields = "*" ist

as3

var statement:SQLStatement = new SQLStatement();
statement.connection = connection;
statement.text = "INSERT :Fields FROM Category";
statement.parameters[":Fields"] = "*";
statement.execute;

Funktioniert nicht (SQL-Syntaxfehler bei ":Tabelle"):

sqlite

"INSERT :Fields FROM :Table", wobei die Parameter :Fields = "*" und :Table = "Category" sind

as3

var statement:SQLStatement = new SQLStatement();
statement.connection = connection;
statement.text = "INSERT :Fields FROM :Table";
statement.parameters[":Fields"] = "*";
statement.parameters[":Table"] = "Category";
statement.execute;

36voto

pilcrow Punkte 53851

In der Regel kann man SQL-Parameter/Platzhalter nicht verwenden für Datenbankbezeichner (Tabellen, Spalten, Ansichten, Schemata usw.) oder Datenbankfunktionen (z. B., CURRENT_DATE ), sondern nur für verbindliche wörtliche Werte .

Mit der serverseitigen Unterstützung für parametrisierte (alias vorbereitete) Anweisungen analysiert die DB-Engine Ihre Abfrage einmal und merkt sich die Besonderheiten aller Parameter - ihre Typen, Höchstlängen, Genauigkeiten usw. -, die Sie in nachfolgenden Ausführungen binden. --, die Sie in nachfolgenden Ausführungen der bereits geparsten Abfrage binden werden. Die Abfrage kann jedoch nicht ordnungsgemäß in ihre syntaktischen Elemente zerlegt werden, wenn kritische Bits, wie Datenbankobjekte, unbekannt sind.

Daher muss man in der Regel die Tabellennamen selbst ersetzen, in einer gespeicherten Prozedur oder in einem Client-Code, der die SQL-Anweisung dynamisch zusammenfügt/interpoliert/was auch immer, damit sie ordnungsgemäß ausgeführt wird. In jedem Fall sollten Sie daran denken, die Funktion Ihrer SQL-API für Anführung von Datenbankkennungen da die API dies nicht für Sie tun wird.

0voto

Shua Punkte 1325

Ich bin mir nicht sicher, ob dies dasselbe ist, aber ich bin in Java auf etwas Ähnliches gestoßen. Im Grunde kann man keine Tabelle als Parameter hinzufügen, also muss man die Anweisung wie folgt generieren:

var statement:SQLStatement = new SQLStatement();
statement.connection = connection;
statement.text = stringUtil.substitute("INSERT :Fields FROM {0}", "Category");
statement.parameters[":Fields"] = "*";
statement.execute;

Dies ist höchstwahrscheinlich nicht die sicherste Lösung, so dass Sie möglicherweise einige benutzerdefinierte Validierung der Daten, bevor Sie den Tabellennamen hinzufügen möchten... damit jemand nicht versucht, den Tabellennamen ";drop tableName..." zu senden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X