flawopen.com/Injeção de SQL em JavaScript/Prisma
O $queryRaw do Prisma é seguro contra SQL Injection?
Pense em um parâmetro como um campo lacrado em um formulário SQL: o banco trata o valor como dado, não como sintaxe. O tagged template $queryRaw vincula os valores interpolados. $queryRawUnsafe também pode vincular valores quando recebe placeholders e argumentos; o risco surge ao concatenar texto não confiável para montar SQL. Nenhum dos métodos parametriza nomes de tabelas ou colunas.
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.
O que os parâmetros do Prisma fazem — e o que não fazem
Em $queryRaw, use diretamente a chamada tagged template: cada valor interpolado vira um parâmetro do banco. Não monte primeiro uma string SQL para passá-la como único argumento. Prisma também aceita placeholders em $queryRawUnsafe(query, ...values), que pode vincular valores, mas o texto SQL ainda precisa ser confiável. Parâmetros representam valores, não identificadores, operadores ou fragmentos SQL. Mapeie cada coluna selecionável para uma allowlist fixa controlada pela aplicação. Prisma recomenda TypedSQL para muitos casos de consultas raw com segurança de tipos.
Como auditar consultas raw do Prisma
grep -rn "\$queryRawUnsafe\|\$executeRawUnsafe" --include="*.ts" --include="*.js" .Perguntas frequentes
Ele aceita strings SQL raw e pode usar placeholders quando os valores são fornecidos separadamente. Essa flexibilidade facilita a construção insegura de strings; revise o texto SQL e os argumentos em conjunto. O método não torna identificadores dinâmicos seguros: escolha-os por uma allowlist fixa.
Referências
- Documentação do Prisma ORM — Consultas raw e prevenção de SQL Injection
- Documentação do Prisma ORM — TypedSQL
- Prisma docs — Acesso raw ao banco de dados
- flawopen.com — SQL Injection em JavaScript