12 Stimmen

SQLite-Parameter - Tabellenname nicht als Parameter zulassen

Ich entwickle eine Anwendung in AIR via Flex, aber ich sehe nicht, wo ich bei SQLite falsch liege (ich bin MySQL gewöhnt). Parameter funktionieren, aber nur in bestimmten Fällen. Ist das Teil des eingebauten Säuberungssystems gegen SQL-Injektion? Danke für jede Hilfe!

Funktioniert:

sqlite

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

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 ":Table"):

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

Im Allgemeinen kann man SQL-Parameter/Platzhalter nicht für Datenbank-Identifikatoren (Tabellen, Spalten, Ansichten, Schemata usw.) oder Datenbankfunktionen (z. B. CURRENT_DATE) verwenden, sondern nur für das Binden von Literalwerten.

Mit serverseitiger Unterstützung für parametrisierte (auch vorbereitete) Anweisungen analysiert das DB-System Ihre Abfrage einmal und merkt sich die Besonderheiten aller Parameter - deren Typen, max Längen, Genauigkeiten usw. - die Sie bei nachfolgenden Ausführungen der bereits analysierten Abfrage binden werden. Aber die Abfrage kann nicht richtig in ihre syntaktischen Elemente geparst werden, wenn wichtige Teile, wie Datenbankobjekte, unbekannt sind.

Also muss man im Allgemeinen Tabellennamen selbst ersetzen, entweder in einer gespeicherten Prozedur oder im Clientcode, der die SQL-Anweisung dynamisch konkateniert/interpoliert/was auch immer, um ordnungsgemäß ausgeführt zu werden. In jedem Fall bitte denken Sie daran, die Funktion der SQL-API zur Quotierung von Datenbank-Identifikatoren zu verwenden, da die API es nicht für Sie erledigt.

0voto

Shua Punkte 1325

Nicht sicher, ob dies dasselbe ist, aber ich bin auf etwas Ähnliches in Java gestoßen. Grundsätzlich können Sie keine Tabelle als Parameter hinzufügen, sodass Sie die Anweisung wie folgt generieren müssen:

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, daher sollten Sie möglicherweise eine benutzerdefinierte Validierung der Daten durchführen, bevor Sie den Tabellennamen hinzufügen... damit niemand 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