flawopen.com/Referenz/FastAPI SQL Injection
Verhindert FastAPI SQL Injection standardmäßig?
Pydantic prüft, ob ein Wert dem deklarierten Typ entspricht. Es schreibt kein SQL um und macht aus einem Python-String keinen Datenbankparameter. Ein validiertes name: str bleibt vom Aufrufer kontrollierter Text. Die Validierung ist wie die Prüfung eines Paketetiketts: Sie bestätigt die Art des Werts; die Parameterbindung hält den Wert getrennt von den SQL-Anweisungen. Lassen Sie die Abfragevorlage unverändert und übergeben Sie Werte separat an SQLAlchemy.
Unsicheres und sicheres FastAPI-Muster
# Die Prüfung auf den Typ string macht Eingaben in SQL-Syntax nicht sicher
@app.get("/users")
def get_users(name: str, db: Session = Depends(get_db)):
query = text(f"SELECT * FROM users WHERE name = '{name}'")
return db.execute(query).fetchall()
# :name ist ein Bind-Parameter; der Wert wird separat übergeben
@app.get("/users")
def get_users(name: str, db: Session = Depends(get_db)):
query = text("SELECT * FROM users WHERE name = :name")
return db.execute(query, {"name": name}).fetchall()
Was die Parameterbindung nicht abdeckt
Ein gebundener Parameter steht für einen Wert, nicht für einen Tabellen- oder Spaltennamen, einen SQL-Operator oder eine Sortierrichtung. Wenn eine Anfrage das Sortierfeld auswählen darf, ordnen Sie die Auswahl einer festen Allowlist von SQLAlchemy-Spaltenausdrücken zu. Fügen Sie niemals den rohen Anfrage-String in SQL ein. Parameterisierung ersetzt außerdem keine Autorisierung: Begrenzen Sie die Zeilen, die eine Person lesen darf, und geben Sie dem Datenbankkonto nur die für diesen Endpunkt nötigen Rechte.
Checkliste zur Prävention
- ✓Interpolieren Sie niemals Anfragedaten in SQLAlchemy-
text()oder in direkt ausgeführte SQL-Strings. - ✓Verwenden Sie benannte Parameter und übergeben Sie Werte separat, zum Beispiel
db.execute(query, {"name": name}). - ✓Ordnen Sie dynamische Tabellen-, Spalten- und Sortierauswahl einer festen Allowlist bekannter SQLAlchemy-Ausdrücke zu.
- ✓Prüfen Sie die Berechtigung für einzelne Zeilen unabhängig davon und beschränken Sie Datenbankrechte auf das Notwendige.
- ✓Bevorzugen Sie SQLAlchemy-
select()-Ausdrücke, wenn sie die Abfrage klar ausdrücken; ein ORM macht unsicheres Roh-SQL nicht sicher.
Quellen
- FastAPI — relationale SQL-Datenbanken
- SQLAlchemy — Parameter und textuelle SQL-Anweisungen
- OWASP — Prävention von SQL Injection