Prepared Statements (Parameterized Queries)
Prepared Statements trennen SQL-Code von User-Input durch Platzhalter. Die Datenbank behandelt Input immer als Daten, nie als Code. Standard-Schutz gegen SQL-Injection.
detaillierte erklärung
Prepared Statements sind eine Datenbank-Funktion, die SQL-Queries in zwei Phasen verarbeitet: 1) Preparation - Query-Struktur mit Platzhaltern wird geparst und kompiliert: SELECT * FROM users WHERE username = ? AND password = ?. 2) Execution - User-Input wird als Parameter gebunden und als reine Daten behandelt, nie als SQL-Code. Die Datenbank kann Parameter nicht als SQL interpretieren, selbst bei Eingaben wie ' OR '1'='1' --. Syntax-Beispiele: Java: PreparedStatement stmt = conn.prepareStatement(sql); stmt.setString(1, username), PHP: $stmt = $pdo->prepare($sql); $stmt->execute([$username]). Vorteil: Performance-Boost bei wiederholten Queries (Query-Plan wird gecached), komplette SQL-Injection-Prevention (wenn korrekt verwendet). Einschränkungen: Funktioniert nicht für dynamische Table/Column-Namen (müssen gewhitelisted werden), nicht für IN-Clauses mit variabler Länge (workaround: mehrere Platzhalter).
warum ist das wichtig?
Prepared Statements sind der einzige zuverlässige Schutz gegen SQL-Injection - du musst verstehen, warum Escaping nicht reicht und wie man sie in verschiedenen Sprachen implementiert. Pflicht für Secure-Coding-Standards.
häufige fehler
- ⚠Prepared Statements nur für Performance - Nein, primär Security-Feature
- ⚠String-Concatenation mit Prepared Statements mischen - Nein, dann kein Schutz (query = "SELECT * FROM " + table + " WHERE id = ?" ist anfällig wenn table ungefiltert)
- ⚠Prepared Statements funktionieren für Table-Namen - Nein, nur für Werte (Table-Namen brauchen Whitelist-Validation)