12 Stimmen

SQLite-Parameter - Die Übermittlung des Tabellennamens als Parameter ist nicht gestattet

Ich entwickle eine Anwendung in AIR über Flex, aber ich sehe nicht, wo ich bei SQLite falsch liege (ich bin MySQL gewöhnt). Parameter funktionieren, aber nur in bestimmten Fällen. Gehört das zum eingebauten Sicherheitssystem gegen SQL-Injektionen? 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

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

Mit serverseitiger Unterstützung für parameterisierte (auch bekannt als vorbereitete) Anweisungen analysiert der DB-Motor Ihre Abfrage einmal und merkt sich die Eigenheiten aller Parameter - ihre Typen, Maximalwerte, Genauigkeiten usw. -, die Sie in anschließenden Ausführungen der bereits analysierten Abfrage binden werden. Die Abfrage kann jedoch nicht ordnungsgemäß in ihre syntaktischen Elemente analysiert werden, wenn wichtige Teile wie Datenbankobjekte unbekannt sind.

Also muss man in der Regel selbst Tabellennamen ersetzen, 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 daran denken, die Funktion Ihres SQL-APIs zum Quoting von Datenbank-Identifikatoren zu verwenden, da das API dies nicht für Sie übernimmt.

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}", "Kategorie");
statement.parameters [":Fields"] = "*";
statement.execute;

Dies ist höchstwahrscheinlich nicht die sicherste Lösung. Daher möchten Sie möglicherweise eine benutzerdefinierte Überprüfung der Daten vornehmen, bevor Sie den Tabellennamen hinzufügen, damit niemand versucht, den Tabellennamen zu senden ";drop tableName..."

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