2017-09-26 6 views
0

Ich möchte eine NpgsqlConnection.BeginTextExport() Abfrage erstellen, die die Tabelle angibt, die als Parameter exportiert werden soll. Die naive way dies zu tun ist:Defensive Parameter für COPY-Abfrage mit Npgsql?

using (var reader = conn.BeginTextExport("COPY " + myTable + " TO STDOUT")) 
{ 
    Console.WriteLine(reader.ReadLine()); 
} 

Aber ich mag es nicht, weil der offensichtlichen SQL-Injection-Muster. Ich kann mir viele etwas komplizierte Optionen vorstellen, um das Feld myTable zu desinfizieren, aber ich frage mich, ob das kanonische Muster hier ist. Irgendeine Idee?

Antwort

1

Ich glaube in Ihrem Fall sollten Sie bleiben "Entkommen alle User-gelieferten Input".

Diese Technik wird im Allgemeinen als letzter Ausweg verwendet. Die Validierung von Eingaben ist wahrscheinlich die bessere Wahl, da diese Methode im Vergleich zu anderen Abwehrmechanismen gebrechlich ist und wir nicht garantieren können, dass sie die gesamte SQL-Injektion in allen Situationen verhindert.

Diese Technik dient dazu, Benutzereingaben zu vermeiden, bevor sie in eine Abfrage eingefügt werden. Es ist sehr datenbankspezifisch in seiner Implementierung. Es wird normalerweise nur empfohlen, älteren Code nachzurüsten, wenn die Implementierung der Eingabevalidierung nicht kosteneffektiv ist. Anwendungen, die von Grund auf neu erstellt werden, oder Anwendungen, die eine geringe Risikotoleranz erfordern, sollten mit parametrisierten Abfragen, gespeicherten Prozeduren oder einer Art von Object Relationalem Mapper (ORM), die Ihre Abfragen für Sie erstellt, erstellt oder neu geschrieben werden.

Diese Technik funktioniert so. Jedes DBMS unterstützt ein oder mehrere Zeichenumgehungsschemas, die für bestimmte Arten von Abfragen spezifisch sind. Wenn Sie dann alle vom Benutzer bereitgestellten Eingaben mit dem richtigen Escapeschema für die von Ihnen verwendete Datenbank umgehen, verwechselt das DBMS diese Eingabe nicht mit dem vom Entwickler geschriebenen SQL-Code, wodurch mögliche SQL-Injection-Schwachstellen vermieden werden.

Im Fall, wenn PostGres Sie Dollar Zitiert

https://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-DOLLAR-QUOTING

1

https://github.com/npgsql/npgsql/issues/1677 Siehe verwenden.

Der Kern der Antwort ist, dass Npgsql einfach Parameter an PostgreSQL weiterleitet (anstatt die Substitution clientseitig vorzunehmen), und PostgreSQL unterstützt keine Parameter in Tabellennamen. Siehe die github-Antwort für einige Gründe dafür.