FlawOpen

flawopen.com/Referenz/FastAPI SQL Injection

Verhindert FastAPI SQL Injection standardmäßig?

Python- und API-Leitfaden
Kurzantwort

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

UNSICHER: Interpolation verändert den SQL-Text
# 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()
SICHER: SQLAlchemy bindet den Wert separat
# :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

Quellen

Siehe auch SQL-Injection (CWE-89): Funktionsweise und Schutz in jeder Sprache — flawopen.com GORM Raw SQL: SQL-Injection in Go verhindern Reicht das Escapen von Anführungszeichen gegen SQL Injection? Reicht ein ORM aus, um SQL-Injection zu verhindern? Ist Knex.js vor SQL-Injection geschützt? MyBatis ${} vs. #{}: SQL Injection verhindern MySQLi vs. PDO: sichere Prepared Statements