12 Stimmen

SQLite-Parameter - Ermöglicht keinen Tabellennamen als Parameter.

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

Funktioniert:

sqlite

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

as3

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

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

sqlite

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

as3

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

36voto

pilcrow Punkte 53851

Im Allgemeinen können SQL-Parameter/Platzhalter nicht für Datenbank-Bezeichner (Tabellen, Spalten, Ansichten, Schemata usw.) oder Datenbankfunktionen (z. B. CURRENT_DATE) verwendet werden, sondern nur zum Binden von literalen Werten.

Mit serverseitiger Unterstützung für parametrisierte (auch bekannte als vorbereitete) Anweisungen analysiert der Datenbank-Engine Ihre Abfrage einmal, erinnert sich an die Besonderheiten aller Parameter - ihre Typen, maximale Längen, Genauigkeiten usw. -, die Sie bei nachfolgenden Ausführungen der bereits analysierten Abfrage binden werden. Die Abfrage kann jedoch nicht ordnungsgemäß in ihre syntaktischen Elemente analysiert werden, wenn wichtige Bestandteile, wie Datenbankobjekte, unbekannt sind.

In der Regel muss man daher Tabellennamen selbst ersetzen, sei es in einer gespeicherten Prozedur oder im Clientcode, der die SQL-Anweisung dynamisch konkat/interpoliert/wasauchimmer für eine ordnungsgemäße Ausführung vorbereitet. In jedem Fall denken Sie bitte daran, die SQL-API-Funktion zum Quoten von Datenbank-Bezeichnern zu verwenden, da die API dies nicht automatisch für Sie erledigt.

0voto

Shua Punkte 1325

Nicht sicher, ob das dasselbe ist, aber ich bin auf etwas Ähnliches in Java gestoßen. Grundsätzlich können Sie eine Tabelle nicht als Parameter hinzufügen, daher müssen Sie die Anweisung so generieren:

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

Dies ist höchstwahrscheinlich nicht die sicherste Lösung, daher sollten Sie die Daten möglicherweise benutzerdefiniert validieren, 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