Schutz vor SQL-Injection
Verhindern Sie Injection-Angriffe
Schutz vor SQL-Injection ist eine kostenlose Cyber Security Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Cyber Security Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Cyber Security Academy-Kurs umfasst insgesamt 4 Lektionen.
Was ist SQL-Injection
SQL-Injection (SQLi) tritt auf, wenn nicht vertrauenswürdige Benutzereingaben direkt an eine SQL-Abfrage angehängt werden. Der Angreifer schleust SQL-Syntax in ein Feld ein, das die Anwendung als reine Daten erwartet, und ändert dadurch die Bedeutung der Abfrage.
SQL-Injection gehört weiterhin zu den folgenreichsten Web-Schwachstellen, weil dadurch ganze Datenbanken offengelegt, Anmeldungen umgangen oder Daten zerstört werden können.
Eine anfällige Abfrage
Der klassische Fehler ist die Verkettung von Zeichenfolgen. Bei der Eingabe tom ist die Abfrage korrekt, aber eine speziell präparierte Eingabe schreibt die Logik um.
- Das einfache Anführungszeichen schließt die Zeichenfolge vorzeitig.
- Alles danach wird als ausführbares SQL interpretiert.
query = "SELECT * FROM users WHERE name = '" + userInput + "'";
// userInput = tom' OR '1'='1
// becomes: SELECT * FROM users WHERE name = 'tom' OR '1'='1'Umgehung der Authentifizierung
Anmeldeformulare sind ein bevorzugtes Ziel. Indem ein Angreifer eine immer wahre Bedingung einschleust und den Rest auskommentiert, kann er sich ohne Passwort anmelden.
Die Sequenz -- kommentiert die verbleibende Klausel aus, sodass die Passwortprüfung ignoriert wird.
-- attacker enters in the username field:
admin' --
-- resulting query:
SELECT * FROM users WHERE user = 'admin' --' AND pass = '...'Parametrisierte Abfragen
Die wichtigste Abwehrmaßnahme sind parametrisierte Abfragen (vorbereitete Anweisungen). Die SQL-Struktur wird getrennt von den Daten übermittelt, sodass Eingaben immer als Werte und niemals als Code behandelt werden.
Der Datenbanktreiber bindet Platzhalter wie ? sicher an die bereitgestellten Werte.
-- Python (sqlite3 / psycopg)
cur.execute(
'SELECT * FROM users WHERE name = ? AND pass = ?',
(username, password)
)Vorbereitete Anweisungen in Java
Jede gängige Programmiersprache unterstützt Parametrisierung. Verwenden Sie in Java PreparedStatement, statt Zeichenfolgen mit Statement zu erstellen.
Gebundene Parameter können nicht aus ihrem Platz ausbrechen, daher ist SQL-Injection hier strukturell unmöglich.
PreparedStatement ps = conn.prepareStatement(
"SELECT * FROM users WHERE name = ?");
ps.setString(1, userInput);
ResultSet rs = ps.executeQuery();Gespeicherte Prozeduren
Gespeicherte Prozeduren können hilfreich sein, wenn sie intern parametrisierte Eingaben verwenden. Seien Sie jedoch vorsichtig: Eine gespeicherte Prozedur, die dynamisches SQL durch Verkettung erstellt, ist genauso anfällig.
- Sicher: an die Prozedur übergebene Parameter.
- Unsicher:
EXEC()verketteter Zeichenfolgen innerhalb der Prozedur.
Eingabevalidierung und Allowlists
Validierung ist eine nützliche zweite Schutzschicht. Verwenden Sie Allowlists (akzeptieren Sie nur bekannte, zulässige Muster) statt Blocklists (versuchen Sie, schädliche Zeichen zu verbieten).
Ein numerisches ID-Feld sollte beispielsweise alles ablehnen, was nicht ausschließlich aus Ziffern besteht, bevor die Eingabe überhaupt die Abfrage erreicht.
if not user_id.isdigit():
raise ValueError('invalid id')
# only then use the valueEscaping nur als letzter Ausweg
Das manuelle Maskieren von Anführungszeichen ist fehleranfällig und schwierig zuverlässig umzusetzen. Verschiedene Datenbanken haben unterschiedliche Regeln für das Escaping, und Sonderfälle wie Kodierungstricks oder Injection-Angriffe zweiter Ordnung können durchrutschen.
Bevorzugen Sie parametrisierte Abfragen. Verwenden Sie Escaping nur, wenn ein ORM oder Treiber einen bestimmten Bezeichner nicht parametrisieren kann.
Geringste Rechte für Datenbankkonten
Begrenzen Sie den Schaden einer erfolgreichen Injection, indem Sie das Prinzip der geringsten Rechte auf den Datenbankbenutzer der Anwendung anwenden.
- Gewähren Sie auf den benötigten Tabellen nur
SELECT,INSERTundUPDATE. - Verwenden Sie für die Anwendung niemals ein Superuser- oder
root-Konto. - Verweigern Sie
DROP,FILEund Administratorrechte.
GRANT SELECT, INSERT, UPDATE ON appdb.orders TO 'webapp'@'%';
REVOKE DROP, ALTER ON appdb.* FROM 'webapp'@'%';ORMs und Abfrage-Builder
Moderne ORMs (Hibernate, Sequelize, Django ORM, SQLAlchemy) parametrisieren standardmäßig, wodurch das meiste SQL-Injection-Risiko entfällt.
Die Gefahr kehrt zurück, wenn Entwickler auf rohes SQL ausweichen oder in einem Abfrage-Builder Zeichenfolgeninterpolation verwenden. Übergeben Sie Werte auch im Raw-Modus immer als gebundene Parameter.
Mehrschichtige Abwehr
Keine einzelne Maßnahme reicht aus. Kombinieren Sie mehrere Schutzschichten:
- Parametrisierte Abfragen überall (primäre Maßnahme).
- Eingabevalidierung und Allowlists.
- Datenbankkonten mit geringsten Rechten.
- Eine Web Application Firewall (WAF), die bekannte Muster erkennt.
- Fehlerbehandlung, die niemals SQL oder Stacktraces offenlegt.
Kurze Überprüfung
Testen Sie Ihr Verständnis der wichtigsten Abwehrmaßnahme.
Zusammenfassung
Sie haben gelernt, wie SQL-Injection funktioniert und wie sie verhindert wird:
- SQLi entsteht, wenn nicht vertrauenswürdige Eingaben an Abfragen angehängt werden.
- Parametrisierte Abfragen sind die wichtigste Abwehrmaßnahme.
- Ergänzen Sie die Absicherung durch Allowlist-Validierung, Datenbankkonten mit geringsten Rechten und eine WAF.
- Vermeiden Sie manuelles Escaping und dynamisches SQL in gespeicherten Prozeduren.
Eine mehrschichtige Abwehr verhindert, dass ein einzelner Fehler zu einem Sicherheitsvorfall wird.
Häufig gestellte Fragen
Ist die Lektion „Schutz vor SQL-Injection“ kostenlos?
Ja — der vollständige Text von „Schutz vor SQL-Injection“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Cyber Security Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Cyber Security Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Schutz vor SQL-Injection“?
Verhindern Sie Injection-Angriffe Du übst Cyber Security Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Cyber Security Academy zu starten?
Keine Vorkenntnisse erforderlich. Cyber Security Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „Schutz vor SQL-Injection“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Cyber Security Academy-Lektion Code schreiben und ausführen?
Ja. Jede Cyber Security Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Schutz vor SQL-Injection
- Zugriffskontrolle und Verschlüsselung
- Auditierung und Monitoring
- Sicherheit von Backups und Wiederherstellung