Meine Idee ist es, einige generische Klassen für Einfügen / Aktualisieren / Auswählen über eine C # (3.5) Winforms App zu erstellen, die mit einer MySQL Datenbank über MySQL .NET Connector 6.2.2 kommuniziert.
Zum Beispiel:
%Vor%Dann kann ich von überall im Programm eine Abfrage mit / ohne Benutzereingabe ausführen, indem ich einfach eine SQL-Abfragezeichenfolge übergebe.
Das Lesen von SO gibt mir den Hinweis, dass dies zu SQL-Injection-Angriffen (für alle Benutzereingabewerte) führen kann. Gibt es sowieso Scrubing der eingegebenen strSQL oder muss ich individuelle parametrisierte Abfragen in jeder Methode erstellen, die eine Datenbankfunktion ausführen muss?
UPDATE1:
Meine endgültige Lösung sieht ungefähr so aus:
%Vor%Sie sollten auf jeden Fall parametrisierte Abfragen verwenden, um sich selbst zu schützen.
Sie müssen jedoch nicht jedes Mal parametrisierte Abfragen erstellen. Sie könnten die generische Methode ändern, die Sie zur Verfügung gestellt haben, um eine Sammlung von MySqlParameters
zu akzeptieren:
Ich sollte auch erwähnen, dass Sie SEHR vorsichtig sein sollten, Ihre Verbindungen zu bereinigen, nachdem Sie sie nicht mehr verwenden (normalerweise in einem using
-Block behandelt, aber ich sehe diese Detailebene in Ihrem Codebeispiel nicht) .
Die Parametrisierung ist sehr einfach. Viel einfacher als das Scrubben von SQL-Abfragen und weniger unordentlich oder fehleranfällig als das manuelle Entkommen.
Leicht bearbeitetes Kopieren / Einfügen von dieser Tutorial-Seite weil ich mich faul fühle:
%Vor%Das war nicht so schwer, oder? :)
Es ist unmöglich, SQL-Injection nach der Tatsache zu erkennen (mit anderen Worten, sobald Sie einen dynamischen Query-String konstruiert haben, ist es unmöglich zu unterscheiden, was das "echte" SQL gegenüber injiziertem SQL ist).
Wenn Sie Benutzern die Ausführung von beliebigem SQL erlauben möchten, scheint es, als würden Sie sich keine Sorgen über SQL-Injection machen (da dies das Ziel der SQL-Injektion ist).
Ich würde erwarten, dass es ziemlich schwierig wäre, Rohtext zu scrubben, der für SQL verwendet wird. Wenn möglich, würde ich versuchen, parametrisierte Operationen zu verwenden.
Eine Ausnahme wäre, wenn Sie die Funktion nicht öffentlich verfügbar gemacht hätten und Sie nie eine Zeichenfolge übergeben hätten, die aus rohen Benutzereingaben erstellt wurde.
Ich würde vorschlagen, IDataParameter-Objekte zu verwenden, um Ihre Abfragen zu parametrisieren.
Ja, Sie müssen parametrisierte Abfragen erstellen, alles andere wird ein Risiko der SQL-Injection einführen
Tags und Links .net c# mysql mysql-connector mysql-parameter