FlawOpen

flawopen.com/SQL-Injection in Python/SQLAlchemy

Ist SQLAlchemy text() vor SQL-Injection sicher?

Referenzleitfaden
Kurzantwort

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.

UNSICHER — Eingabe in SQL interpolieren
stmt = text(
  f"SELECT id FROM users WHERE id = {user_id}"
)
rows = conn.execute(stmt)
ABGESICHERT — Werte binden und SQL-Struktur begrenzen
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

Sind SQLAlchemy-Core- und ORM-Abfragekonstrukte immer sicher?

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

Siehe auch SQL-Injection (CWE-89): Funktionsweise und Schutz in jeder Sprache — flawopen.com Verhindert sqlx-Abfrageprüfung zur Kompilierzeit SQL-Injection? Schützen gespeicherte Prozeduren vor SQL-Injection? Ist TypeORM QueryBuilder vor SQL-Injection sicher? Django ORM und SQL Injection: sichere Muster Doctrine ORM: SQL-Injection vermeiden EF Core FromSqlRaw: Sicheres SQL mit Parametern