SQL Injection
Sicherheit & Praxis
Was ist SQL Injection?
SQL Injection ist eine der gefährlichsten Sicherheitslücken in Anwendungen. Sie entsteht, wenn ein Programm Benutzereingaben direkt in einen SQL-Befehl einfügt (zusammenstringt). Ein Angreifer kann dann eigenen SQL-Code „einschleusen“ und die ursprüngliche Abfrage verändern – um Daten auszulesen, zu ändern oder ganze Tabellen zu löschen.
Klassisches Beispiel
Eine Login-Abfrage wird unsicher aus Eingaben zusammengebaut:
-- Eingabe wird ungeprüft eingesetzt (UNSICHER!) SELECT * FROM Kunden WHERE Name = '" + eingabe + "';
Gibt der Angreifer als Name Folgendes ein:
' OR '1'='1
… entsteht diese Abfrage:
SELECT * FROM Kunden WHERE Name = '' OR '1'='1';
Weil '1'='1' immer wahr ist, liefert die Abfrage alle Kunden zurück – die Bedingung ist ausgehebelt. Mit angehängten Befehlen wie ; DROP TABLE Kunden; -- lassen sich sogar Tabellen löschen.
Die zentrale Regel
Füge niemals Benutzereingaben per String-Verkettung in SQL ein. Behandle jede Eingabe grundsätzlich als potenziell bösartig.
Gegenmaßnahmen
- Prepared Statements / parametrisierte Abfragen verwenden – die wichtigste und wirksamste Maßnahme. Werte werden getrennt von der SQL-Logik übergeben und nie als Code interpretiert.
- Least Privilege: Der Datenbank-Benutzer der Anwendung sollte nur die nötigsten Rechte haben (z. B. kein
DROP). - Eingaben zusätzlich validieren (Typ, Länge, Format) – als Ergänzung, nicht als Ersatz.
- Detaillierte Fehlermeldungen nicht nach außen zeigen, damit Angreifer keine Struktur ableiten können.
Was ist die wirksamste Maßnahme gegen SQL Injection?
Hinweis
Verlasse dich nicht auf eigenes „Escapen“ von Eingaben – das ist fehleranfällig. Nutze konsequent Prepared Statements und übergib Werte als Parameter. Das ist heute Standard in jeder ernsthaften Anwendung.