Parametrisierte Abfragen ermöglichen es, Werte durch spezielle Parameter an die Abfrage zu übergeben, anstatt sie direkt durch Variablenersetzung einzufügen. Dies erhöht die Sicherheit und schützt vor SQL-Injection, sowie beschleunigt die Ausführung wiederholter Abfragen durch das Caching des Plans.
Dynamisches SQL ermöglicht das Erstellen und Ausführen von Abfragen zur Laufzeit (zum Beispiel durch EXEC sp_executesql in MS SQL oder PREPARE/EXECUTE in PostgreSQL). Man muss sehr vorsichtig sein: Das Einfügen von Werten direkt in den Anfragetext kann zu SQL-Injektionen, Syntaxfehlern und schlechter Leistung führen.
Beispiel für eine parametrisierte Abfrage (in Python mit der Bibliothek psycopg2):
cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
Beispiel für dynamisches SQL in PostgreSQL:
EXECUTE format('SELECT * FROM %I WHERE value = %L', tablename, value);
Frage: Warum reicht es nicht aus, einfach Anführungszeichen (') zu escapen, wie es einige alte Anwendungen tun, um sich vor SQL-Injektionen zu schützen?
Antwort:
Das Escapen von Anführungszeichen schützt nicht vor allen Arten von Injektionen, insbesondere wenn ein Angreifer eine SQL-Abfrage-Struktur einfügt (zum Beispiel "; DROP TABLE users;"). Darüber hinaus deckt es nicht alle Besonderheiten verschiedener Datentypen ab und schützt nicht vor dem Umgehen von Filtern durch Codierung oder Sonderzeichen. Man sollte immer parametrisierte Abfragen verwenden.
Geschichte
Geschichte
Geschichte
In einem CRM verursachte der Buchstabe “O'Connor” einen Fehler in der Anwendung, die SQL-Anfragen durch einfaches Verketten von Strings erstellte. Aufgrund des nicht escapten einfachen Anführungszeichens konnte kein Datensatz mit diesem Nachnamen gespeichert werden, was erst ein Jahr später festgestellt wurde.