FlawOpen

flawopen.com/Injection SQL en JavaScript/Prisma

Prisma $queryRaw protège-t-il contre les injections SQL ?

Guide de référence
Réponse courte

Voyez un paramètre comme un champ scellé dans un formulaire SQL : la base traite la valeur comme une donnée, pas comme de la syntaxe. Le tagged template $queryRaw lie les valeurs interpolées. $queryRawUnsafe peut aussi lier des valeurs si vous fournissez des placeholders et des arguments ; le risque apparaît lorsque du texte non fiable est concaténé pour construire le SQL. Aucune de ces méthodes ne paramètre les noms de table ou de colonne.

NON SÛR — concaténer l’entrée dans SQL
const userId = request.query.userId;
const query =
  `SELECT id FROM users WHERE id = ${userId}`;
const rows = await prisma.$queryRawUnsafe(query);
RENFORCÉ — lier les valeurs et borner la structure par allowlist
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.

Ce que font les paramètres Prisma — et leurs limites

Avec $queryRaw, utilisez directement l’appel tagged template : chaque valeur interpolée devient un paramètre de la base. Ne construisez pas d’abord une chaîne SQL à transmettre comme seul argument. Prisma accepte aussi des placeholders avec $queryRawUnsafe(query, ...values) ; les valeurs peuvent ainsi être liées, mais le texte SQL doit rester fiable. Les paramètres représentent des données, pas des identifiants, opérateurs ou fragments SQL. Associez toute colonne sélectionnable à une allowlist fixe contrôlée par l’application. Prisma recommande TypedSQL pour de nombreux cas de requêtes raw typées.

Auditer les requêtes raw Prisma

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

FAQ

Pourquoi $queryRawUnsafe existe-t-il ?

Cette méthode accepte du SQL raw et des placeholders si les valeurs sont transmises séparément. Sa flexibilité facilite la construction de chaînes dangereuses : examinez ensemble le texte SQL et les arguments. Elle ne sécurise pas les identifiants dynamiques ; choisissez-les dans une allowlist fixe.

Références

À voir aussi Injection SQL (CWE-89) : fonctionnement et prévention dans chaque langage — flawopen.com L’interpolation dans where() de Rails est-elle sûre ? Sequelize query() protège-t-il contre les injections SQL ? SQLAlchemy text() protège-t-il contre les injections SQL ? La vérification des requêtes sqlx à la compilation empêche-t-elle les injections SQL ? Les procédures stockées empêchent-elles l’injection SQL ? TypeORM QueryBuilder protège-t-il des injections SQL ?