flawopen.com/SQL Injection/Reicht ein ORM?
Reicht ein ORM aus, um SQL-Injection zu verhindern?
Ein ORM ähnelt einer Küche, die Bestellungen anhand eines Formulars zubereitet: Der normale Query-Builder trennt die Werte. Ein Raw-SQL-Kürzel ist ein anderer Zugang mit eigenen Regeln. Prüfen Sie die API, bevor Sie interpolierten Werten vertrauen.
var sql = $"SELECT * FROM dbo.Blogs WHERE Url = '{url}'";
var rows = await context.Blogs
.FromSqlRaw(sql)
.ToListAsync();
// User text is inserted into SQL before execution.
var rows = await context.Blogs
.FromSql($"SELECT * FROM dbo.Blogs WHERE Url = {url}")
.ToListAsync();
// EF Core 7+: interpolation becomes a SQL parameter.
Das Muster, in jedem ORM
ORM-Query-Builder und Raw-SQL-APIs bilden keine einheitliche Sicherheitsgrenze. Die offizielle Dokumentation beschreibt sicheres Binden mit Django raw(sql, params), SQLAlchemy text() und separaten Ausführungsparametern, Rails-Platzhaltern, EF Core FromSql (ab 7) / FromSqlInterpolated, GORM Raw(sql, args...) und Prisma $queryRaw als Tagged Template. Raw-APIs unterscheiden sich: FromSqlRaw ist mit separat übergebenen Parametern sicher, aber nicht, wenn Benutzereingaben in den SQL-String eingefügt werden; $queryRawUnsafe kann Werte separat binden, doch verketteter nicht vertrauenswürdiger Text bleibt unsicher. Der Methodenname allein belegt nicht, wie Werte verarbeitet werden. Binden Sie jeden Wert über den dokumentierten Mechanismus. SQL-Bezeichner und Query-Struktur sind keine Parameter; wählen Sie sie aus einer festen, anwendungskontrollierten Allowlist. Die folgenden Leitfäden erläutern die Verträge.
Was "ausreichend" wirklich erfordert
- ✓Verwenden Sie den ORM-Builder für normale Werte und Filter.
- ✓Binden Sie in Raw-SQL jeden Wert über den dokumentierten Parametermechanismus.
- ✓Wählen Sie dynamische Bezeichner aus festen anwendungskontrollierten Allowlists; Parameter binden keine SQL-Struktur.
- ✓Prüfen Sie Raw-Query-Aufrufe auf Verkettungen, Interpolation und Varianten mit erhöhtem Risiko.
FAQ
Nein. Einige Raw-SQL-APIs binden separat übergebene Werte, und sichere APIs können interpolierte Werte als Parameter entgegennehmen. EF Core 7+ FromSql akzeptiert ein interpoliertes FormattableString; FromSqlRaw benötigt separat übergebene Parameter. Prisma $queryRawUnsafe kann ebenfalls Werte binden, bereinigt aber keinen selbst zusammengesetzten SQL-Text. Prüfen Sie den Methodenvertrag und halten Sie nicht vertrauenswürdige Werte aus der SQL-Struktur heraus.
Quellen
- Django SQL-Abfragen
- SQLAlchemy DBAPI
- Rails Active Record
- EF Core SQL-Abfragen
- GORM Sicherheit
- Prisma Raw-Abfragen
- Django-Leitfaden
- SQLAlchemy-Leitfaden
- Rails-Leitfaden
- EF-Core-Leitfaden
- GORM-Leitfaden
- Prisma-Leitfaden