flawopen.com/SQL-Injection in Python/SQLAlchemy
Ist SQLAlchemy text() vor SQL-Injection sicher?
Ein gebundener Parameter ist wie eine versiegelte Wertekarte in einem Abfrageformular: SQLAlchemy übergibt das SQL-Statement und seine Parameterzuordnung an das zugrunde liegende DBAPI. So bleiben Werte aus dem SQL-Ausdruck heraus, den dein Code erstellt. Der DBAPI-Treiber übernimmt die datenbankspezifische Bindung; der Transport kann daher variieren. text() akzeptiert SQL-Text, bereinigt oder parametrisiert aber keine Werte, die bereits in diesen Text interpoliert wurden.
stmt = text(
f"SELECT id FROM users WHERE id = {user_id}"
)
rows = conn.execute(stmt)
stmt = text(
"SELECT id FROM users WHERE id = :id"
)
rows = conn.execute(stmt, {"id": user_id})
# Bind values, not identifiers. Choose any
# selectable column from a fixed application map.
columns = {"name": users.c.name,
"created": users.c.created_at}
column = columns.get(requested_sort, users.c.created_at)
stmt = select(users.c.id).order_by(column)
rows = conn.execute(stmt)
Was text() tut — und was nicht
text() erstellt eine textuelle SQL-Konstruktion; eine Zeichenkette mit bereits interpolierter Eingabe wird dadurch nicht bereinigt. Deklariere Wert-Platzhalter im SQL und übergib die Werte separat an Connection.execute() oder Session.execute(). SQLAlchemy Core bindet Python-Literalwerte in passenden Ausdruckskonstruktionen, doch textuelle Fragmente bleiben SQL-Syntax. Parameter ersetzen keine Tabellen- oder Spaltennamen und keine Sortierrichtungen. Ordne nutzergewählte Struktur festen SQLAlchemy-Ausdrücken zu. Parametrisierung verhindert SQL-Injection, ersetzt aber weder Autorisierung noch die Validierung fachlicher Regeln.
Codebestand prüfen
rg -n 'text\(|\.execute\(' --glob '*.py' .FAQ
Sie binden Python-Werte in normalen Ausdruckskonstruktionen; die Sicherheit hängt jedoch davon ab, wie die Anweisung gebaut wird. Prüfe textuelles SQL, literale SQL-Konstrukte und dynamische Bezeichner. Keine API macht einen SQL-String sicher, nachdem Eingaben angehängt wurden.
Quellen
- SQLAlchemy-2.0-Tutorial — Parameter übergeben
- SQLAlchemy-2.0-Tutorial — SQL-Ausdrücke und textuelles SQL
- OWASP — Schutz vor SQL-Injection
- flawopen.com — SQL-Injection in Python