flawopen.com/SQL Injection/Was ist eine parametrisierte Abfrage?
Was ist eine parametrisierte Abfrage, einfach erklärt?
Denk an ein Formular mit beschrifteten Feldern: Das Programm lässt die Anweisungen unverändert und bittet die Datenbankbibliothek, jeden Wert in das passende Feld einzusetzen. Die Bibliothek kann native serverseitige Vorbereitung verwenden oder sie clientseitig nachbilden; der Anwendungscode darf die Anweisungen dennoch nicht mit Benutzereingaben umschreiben.
Der Mechanismus
Bei einem nativ serverseitig vorbereiteten Statement bereitet der Treiber SQL mit Platzhaltern vor und übergibt die gebundenen Werte bei der Ausführung. Protokoll und Zeitpunkt hängen von Datenbank und Treiber ab. Manche Treiber können die Vorbereitung clientseitig nachbilden; PDO dokumentiert diesen Modus ausdrücklich. Der API-Aufruf allein zeigt also nicht, wie der Wert übertragen wird. Halte die SQL-Struktur fest, verwende die dokumentierte Bindungs-API des Treibers und prüfe, ob der native oder emulierte Modus aktiv ist.
Warum das anders ist als bloßes "sorgfältiges Escapen"
Manuelles Escaping verlangt, dass der Anwendungscode Werte vor dem Verketten korrekt kodiert; das ist fragil und kontextabhängig. Eine Parameter-API überlässt die Wertbehandlung dem Treiber. Bei nativer serverseitiger Vorbereitung werden Werte als separate Protokollparameter übertragen; bei Emulation verarbeitet der Treiber die Platzhalter clientseitig. Baue Benutzereingaben nicht in SQL-Zeichenketten ein, die die Anwendung selbst erstellt, und prüfe das dokumentierte Bindungsverhalten des Treibers.
FAQ
Eng verwandt — ein Prepared Statement ist das datenbankseitige Objekt, das aus der festen Abfragestruktur erstellt wird; Parametrisierung ist die Praxis, Werte separat daran zu binden. Die Begriffe werden oft synonym verwendet.
Nur für Werte (Daten), nicht für Bezeichner wie Tabellen- oder Spaltennamen — die brauchen eine andere Verteidigung, typischerweise eine Allow-List.
Quellen
- OWASP — Cheat Sheet zur Prävention von SQL-Injection
- flawopen.com — SQL-Injection (alle Sprachen)
- PHP Manual — PDO::ATTR_EMULATE_PREPARES
- MySQL Reference — COM_STMT_PREPARE
- MySQL Reference — COM_STMT_EXECUTE