flawopen.com/SQL-Injection in JavaScript/Prisma
Ist Prisma $queryRaw vor SQL-Injection sicher?
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.
const userId = request.query.userId;
const query =
`SELECT id FROM users WHERE id = ${userId}`;
const rows = await prisma.$queryRawUnsafe(query);
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
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
- Prisma-ORM-Dokumentation — Raw-Abfragen und Schutz vor SQL-Injection
- Prisma-ORM-Dokumentation — TypedSQL
- Prisma-Dokumentation — Raw-Datenbankzugriff
- flawopen.com — SQL-Injection in JavaScript