ProgrammierungFullstack-Entwickler

Erzählen Sie von parametrierten Abfragen und dynamischem SQL. Wann sollten Sie jeden Ansatz verwenden, welche Risiken sind mit dynamischem SQL verbunden und wie können diese vermieden werden? Geben Sie Beispiele an.

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort.

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);

Fangfrage.

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

In einem der Gehaltsabrechnungssysteme generierte dynamsiches SQL Berichte. Aufgrund fehlender Unterstützung für Parametrisierung wurdenmanuellStrings zusammengefügt. Ein Benutzer übergab versehentlich (oder auch nicht) einen Teil einer SQL-Anweisung in das Feld "Nachname" – dies ermöglichte den Zugang zu fremden Gehältern.

Geschichte

Ein kleiner Online-Shop nutzte dynamisches SQL zur Filterung von Produkten ohne angemessene Validierung. Als der Benutzer versuchte, einen nicht standardmäßigen Wert anzugeben, trat ein SQL-Parserfehler auf, der die Ausgabe aller Produkte zeitweilig "legte".

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.