Parameter
Sicherheit & Praxis
Bedeutung
Parametrisierte Abfragen trennen die SQL-Anweisung von den eingesetzten Werten. Statt Eingaben direkt in den SQL-Text zu schreiben, setzt du Platzhalter ein und übergibst die tatsächlichen Werte separat. Die Datenbank behandelt diese Werte immer als reine Daten – nie als ausführbaren Code. Das ist die Grundlage gegen SQL Injection.
Zwei Arten von Platzhaltern
- Positionsplatzhalter mit Fragezeichen
?– die Werte werden in derselben Reihenfolge übergeben. - Benannte Platzhalter wie
:nameoder:land– die Werte werden über ihren Namen zugeordnet.
Beispiel: Positionsplatzhalter
SELECT Name, Stadt FROM Kunden WHERE Land = ? AND Umsatz > ?;
Übergebene Werte (in Reihenfolge): 'DE', 5000. Die Datenbank setzt sie sicher ein:
| Name | Stadt |
|---|---|
| Müller GmbH | Berlin |
| Schmidt AG | Hamburg |
Beispiel: benannte Platzhalter
SELECT Name, Stadt FROM Kunden WHERE Land = :land AND Umsatz > :minumsatz;
Zuordnung: :land = 'DE', :minumsatz = 5000. Benannte Platzhalter sind besonders bei vielen Werten übersichtlicher.
Warum das sicher ist
Selbst wenn jemand als Wert ' OR '1'='1 übergibt, wird dieser Text als ganz normaler Suchwert behandelt und nicht als SQL ausgeführt. Die Abfrage sucht dann eben nach einem Land namens ' OR '1'='1 und findet schlicht nichts.
Stolperfalle
Platzhalter stehen nur für Werte – nicht für Tabellen- oder Spaltennamen und auch nicht für Schlüsselwörter. Brauchst du dynamische Spaltennamen, musst du sie gegen eine feste Liste erlaubter Werte prüfen (Whitelist), niemals direkt aus der Eingabe übernehmen. Wie Platzhalter technisch funktionieren, zeigt die Lektion Prepared Statements.