FlawOpen

flawopen.com/SQL Injection/Reicht ein ORM?

Reicht ein ORM aus, um SQL-Injection zu verhindern?

Referenzseite
Kurze Antwort

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.

UNSICHER — Benutzereingabe im FromSqlRaw-SQL
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.
SICHER — mit FromSql binden (EF Core 7+)
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

FAQ

Sind Raw-SQL-Methoden immer unsicher?

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

Siehe auch SQL-Injection (CWE-89): Funktionsweise und Schutz in jeder Sprache — flawopen.com Ist Knex.js vor SQL-Injection geschützt? MyBatis ${} vs. #{}: SQL Injection verhindern MySQLi vs. PDO: sichere Prepared Statements Schützt NHibernate vor SQL-Injection? MongoDB NoSQL Injection: sichere Abfragefilter Können auch numerische IDs SQL Injection verursachen?