FlawOpen

flawopen.com/SQL-Injection in JavaScript/Prisma

Ist Prisma $queryRaw vor SQL-Injection sicher?

Referenzleitfaden
Kurzantwort

Ein Parameter ist wie ein versiegeltes Wertefeld in einem SQL-Formular: Die Datenbank behandelt den Wert als Daten, nicht als Syntax. Das Tagged Template $queryRaw bindet interpolierte Werte. Auch $queryRawUnsafe kann Werte binden, wenn Platzhalter und Argumente getrennt übergeben werden; riskant wird es, wenn nicht vertrauenswürdiger Text in SQL verkettet wird. Keine der Methoden parametrisiert Tabellen- oder Spaltennamen.

UNSICHER — Eingaben in SQL verketten
const userId = request.query.userId;
const query =
  `SELECT id FROM users WHERE id = ${userId}`;
const rows = await prisma.$queryRawUnsafe(query);
ABGESICHERT — Werte binden und SQL-Struktur per Allowlist begrenzen
const rows = await prisma.$queryRaw`
  SELECT id FROM users WHERE id = ${userId}
`;

// PostgreSQL example: $1 binds data, not an identifier.
const columns = { name: 'name', created: 'created_at' } as const;
const column = columns[requestedSort as keyof typeof columns] ?? 'created_at';
const pageSize = 25;
const sortedRows = await prisma.$queryRawUnsafe(
  `SELECT id FROM users ORDER BY ${column} LIMIT $1`,
  pageSize
);
// The selected SQL structure comes from a fixed map.

Was Prisma-Parameter leisten — und was nicht

Verwende bei $queryRaw direkt den Tagged-Template-Aufruf: Jeder interpolierte Wert wird zu einem Datenbankparameter. Baue nicht erst einen SQL-String und übergib ihn als einziges Argument. Prisma unterstützt auch Platzhalter mit $queryRawUnsafe(query, ...values); damit lassen sich Werte binden, doch der SQL-Text muss vertrauenswürdig bleiben. Parameter stehen für Datenwerte, nicht für Bezeichner, Operatoren oder SQL-Fragmente. Ordne auswählbare Spalten einer festen, anwendungseigenen Allowlist zu. Prisma empfiehlt TypedSQL für viele typsichere Raw-SQL-Anwendungsfälle.

Prisma-Raw-Abfragen prüfen

grep -rn "\$queryRawUnsafe\|\$executeRawUnsafe" --include="*.ts" --include="*.js" .

FAQ

Warum gibt es $queryRawUnsafe?

Die Methode nimmt Raw-SQL-Strings an und unterstützt Platzhalter, wenn Werte separat übergeben werden. Ihre Flexibilität erleichtert unsicheren Stringaufbau; prüfe SQL-Text und Argumente gemeinsam. Dynamische Bezeichner werden dadurch nicht sicher: Wähle sie aus einer festen Allowlist.

Quellen

Siehe auch SQL-Injection (CWE-89): Funktionsweise und Schutz in jeder Sprache — flawopen.com Ist String-Interpolation in Rails where() sicher? Ist Sequelize query() vor SQL-Injection sicher? Ist SQLAlchemy text() vor SQL-Injection sicher? Verhindert sqlx-Abfrageprüfung zur Kompilierzeit SQL-Injection? Schützen gespeicherte Prozeduren vor SQL-Injection? Ist TypeORM QueryBuilder vor SQL-Injection sicher?