FlawOpen

flawopen.com/SQL Injection em JavaScript/Sequelize

Sequelize query() é seguro contra SQL Injection?

Guia de referência
Resposta curta

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.

INSEGURO — concatenar entrada no SQL
sequelize.query(
  `SELECT * FROM users WHERE id = ${userId}`
)
PROTEGIDO — vincular o valor separadamente
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

Os métodos de modelo do Sequelize são sempre seguros contra SQL Injection?

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

Veja também SQL Injection (CWE-89): como funciona e como evitar em todas as linguagens — flawopen.com SQLAlchemy text() é seguro contra SQL Injection? A verificação de consultas do sqlx em compilação evita SQL injection? Procedimentos armazenados evitam SQL injection? O QueryBuilder do TypeORM é seguro contra SQL Injection? Django ORM e SQL Injection: padrões seguros Injeção SQL no Doctrine ORM: consultas seguras