flawopen.com/Injeção de SQL em JavaScript/Knex.js
Knex.js é seguro contra SQL Injection?
Pense no SQL como um formulário impresso: o binding coloca a entrada em um campo de valor; a interpolação cola o texto nas instruções. O query builder do Knex e knex.raw(sql, bindings) separam valores, mas nomes de tabelas e colunas são estrutura SQL e exigem uma lista permitida confiável.
?? é o marcador de identificador raw do Knex. Ele delimita o identificador, não autoriza a escolha; use uma lista permitida.SEGURO — bindings e lista permitida
const query = knex.raw(
`SELECT * FROM users WHERE id = ${userId}`
);
// A entrada é concatenada ao SQL. const allowedSortColumns = new Set(["created_at", "name"]); const rows = await knex("users") .where("id", userId) .orderBy( allowedSortColumns.has(requestedSort) ? requestedSort : "created_at", requestedDirection === "asc" ? "asc" : "desc" ); // Mantenha o valor separado da sintaxe SQL. knex.raw("SELECT * FROM users WHERE id = ?", [userId]);
Como os bindings do Knex protegem valores
Métodos como .where(), .insert() e .select() separam valores do SQL gerado. Em expressões raw, passe valores como bindings: knex.raw("... = ?", [value]). ? representa valor e ??, identificador. Não interpole entrada em uma string SQL.
Identificadores dinâmicos exigem lista permitida
Um binding não autoriza colunas, tabelas, ordenação, operadores ou fragmentos SQL escolhidos pelo usuário. ?? delimita um identificador, mas não decide se a aplicação deve permiti-lo. Mapeie a escolha para uma lista fixa antes de usar .orderBy(); mantenha palavras-chave e operadores fixos no código.
Como auditar consultas raw
Busque cada chamada knex.raw() e revise em conjunto a string SQL e seus bindings. Confirme que valores usam bindings e identificadores dinâmicos vêm de uma lista pequena. Raw não é automaticamente vulnerável; depende de como SQL e entradas são construídos.
rg -n 'knex\.raw\(' -g '*.js' -g '*.ts' -g '*.mjs' -g '*.cjs' .Perguntas frequentes
Não. Use bindings para valores não confiáveis, por exemplo knex.raw("... = ?", [value]). Interpolar o valor na string o torna parte do SQL. Revise cada chamada raw e suas entradas.
?? é o marcador de identificador raw do Knex. Ele delimita o identificador, não autoriza a escolha; use uma lista permitida.
Referências
- Documentação Knex.js — Raw e bindings
- Documentação Knex.js — Query builder
- flawopen.com — SQL Injection em JavaScript