Sichere Datenbankabfragen in der .NET Umgebung

Bei der Entwicklung jeder Anwendung ziehen wir mögliche Bedrohungen in Betracht, der die Anwendung in der späteren IT Umgebung ausgesetzt sein könnte. Gerade bei Anwendungen, die mit Datenbanken kommunizieren, ist der SQLInjectionAngriff. Diese können auf recht einfache Weise durchgeführt werden. 

SQL-Injection-Angriffe

Diese Angriffe finden zum Beispiel über Formulare auf Webseiten statt. Dabei wird eine SQL-expression zu den im Formular eingegebenen Daten hinzugefügt. Wenn die Anwendung nicht gegen diese Art von Angriff geschützt ist, wird die SQL-expression weitergegeben und zusammen mit der Basisanfrage der Anwendung ausgeführt. 

Auf diese Weise kann der Angreifer das Verhalten der Basisabfrage ändern und z.B. die Datenbank dazu auffordern, alle Benutzerdaten im System zurückzugeben oder einen Login ohne Passworteingabe auszuführen. 

Ein Beispiel für einen SQL-Injection-Angriff

Hier ein Beispiel für einen Angriff, der einen Login ohne Passworteingabe bewirkt. Der Login-Code sieht in unserem Beispiel so aus:

Nach der Dateneingabe in das Formular, z.B. Login: Jan und Passwort: Hasło sieht die gesendete SQLAbfrage wie folgt aus:

Die SQLAbfrage, die von der Datenbank ausgeführt wird, hat dann die Form: 

Die Abfrage wird durch das Zusammenfügen von Textfragmenten erstellt. Auf sehr einfache Wiese kann man nun als Login oder Passwort einen eigenen Text eingeben, das Sonderzeichen ‘. Damit wird der Text abgeschlossen und man kann mit dem Schreiben einer eigenen SQL-Anweisung beginnen. 

Wenn man also Login: Jan’ OR 1=1 und kein Passwort eingibt, sieht die von der Anwendung gesendete SQL-Abfrage wie folgt aus: 

Die in der Datenbank ausgeführte SQL-Abfrage hat dann die Form: 

Auf diese recht simple Weise wurde eine OR-Anweisung eingefügt, die immer wahr ist, sowie ein Kommentar, der den Rest der Anfrage blockiert. Dies führt dazu, dass die Datenbank eine positive Antwort zurückgibt, als ob wir uns regulär mit Passwort angemeldet hätten. 

Schutz vor SQL-Injection-Angriffen

Diese Angriffe können großen Schaden anrichten und sollten nicht unterschätz werden. Zwar ist die Art des Angriffs recht unkompliziert, doch genauso einfach kann man sich auch davor schützen. Man sollte grundsätzlich diese Grundregel befolgen: Vertrauen Sie dem Benutzer niemals und überprüfen Sie stets die Eingabeparameter. 

Eingabeparameter können manuell überprüft werden, was eine zeitaufwändige Aufgabe ist, die zu Fehlern führen kann. 

In .NET gibt es diverse vorgefertigte Lösungen, mit denen Datenbankabfragen auf sichere Weise durchgeführt werden können. 

1. Parameterübergabe über SqlParameter 

Statt Abfragen manuell durchzuführen, kann man SqlCommand verwenden. Hierbei wird der feste Text der Abfrage als CommandText weitergegeben. Alle Parameter werden mit einem @-Zeichen in den Textkörper eingefügt. Anschließend können die Werte der einzelnen Parameter mit der Methode Parameters Add dynamisch übergeben werden. 

2. Verwendung von EntitiyFramework (oder auch anderen Frameworks, solange diese gegen SQL-Injection-Angriffe geschützt sind) 

EntityFramework ist eines der beliebtesten Datenbank-Frameworks in der .NET Umgebung. Hiermit können Datenbankabfragen mit C# und LINQ-Code erstellt werden. Der Code wird dann vom Frankework selbst in einen Datenbankabfrage umgewandelt. EntityFramework verfügt über einen eingebauten Schutz gegen diese Form von Angriffen, so dass Abfragen frei erstellt werden können und keine zusätzliche Validierung von Parametern oder gar eine spezielle Parameterübergabe (wie bei der Verwendung von SqlCommand) erforderlich ist. 

Die Abfrage könnte wie folgt aussehen: