C # und MySQL .NET Connector - Jede Möglichkeit, SQL Injection-Angriffe in einer generischen Klasse zu verhindern?

7

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%     
John M 05.05.2010, 18:13
quelle

8 Antworten

9

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:

%Vor%

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) .

    
Justin Niessner 05.05.2010, 18:20
quelle
10

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? :)

    
Thorarin 05.05.2010 18:24
quelle
1

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).

    
Adam Robinson 05.05.2010 18:16
quelle
1

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.

    
John Weldon 05.05.2010 18:17
quelle
1

Wenn Sie MySqlParameter verwenden und keine einfachen String-Abfragen generieren, sind Sie sicher.

    
Andrey 05.05.2010 18:17
quelle
1

Sie können das nicht wirklich tun - Sie müssten einen SQL-Parser schreiben, der zumindest nicht-trivial und fehleranfällig ist.

Bite die Kugel und parametrisieren Sie Ihre Abfragen.

    
Joe 05.05.2010 18:17
quelle
1

Ich würde vorschlagen, IDataParameter-Objekte zu verwenden, um Ihre Abfragen zu parametrisieren.

    
programatique 05.05.2010 18:18
quelle
1

Ja, Sie müssen parametrisierte Abfragen erstellen, alles andere wird ein Risiko der SQL-Injection einführen

    
Mitchel Sellers 05.05.2010 18:25
quelle