flawopen.com/SQL Injection em JavaScript/Sequelize
Sequelize query() é seguro contra SQL Injection?
Um parâmetro é como um cartão de valor lacrado: o SQL recebe o valor separado das instruções da consulta. No Sequelize v6, bind envia os valores separadamente; replacements escapa e insere os valores antes do envio. Montar a string com entrada não confiável ignora os dois. Nenhum substitui nomes de tabelas ou colunas.
sequelize.query(
`SELECT * FROM users WHERE id = ${userId}`
)
sequelize.query(
"SELECT id FROM users WHERE id = $id",
{ bind: { id: userId },
type: QueryTypes.SELECT }
)
Mantenha valores fora da sintaxe SQL
No Sequelize v6, replacements são escapados e inseridos pelo Sequelize antes de a consulta chegar ao banco; bind envia valores separados do texto SQL. Ambos evitam concatenar valores de usuário ao SQL, mas a sintaxe varia por método e dialeto. Parâmetros não representam nomes de tabela ou coluna, ordenação ou fragmentos SQL. Mapeie estruturas selecionáveis para uma allowlist fixa da aplicação. Métodos de modelo podem parametrizar valores estruturados comuns, mas SQL raw e expressões literais ainda precisam de revisão.
Como auditar consultas Sequelize
rg -n 'sequelize\.query\(|Sequelize\.literal\(' --glob '*.{js,ts,mjs,cjs}' .Perguntas frequentes
Valores estruturados comuns nos métodos de modelo são tratados pela construção de consultas do Sequelize. Ainda revise SQL raw, expressões literais e strings montadas pela aplicação. Parametrização não autoriza acesso a registros nem valida regras de negócio.
Referências
- Documentação Sequelize v6 — Raw Queries, replacements e parâmetros bind
- OWASP — Prevenção de SQL Injection
- flawopen.com — SQL Injection em JavaScript