Revise SQL em busca de gravações perigosas e valores sem parametrização

Cole uma consulta ou um script: cada instrução é revisada como texto neste navegador, com comentários e strings mascarados para não confundir palavras-chave com SQL real. Os achados mantêm o tipo da instrução através de um WITH, exigem WHERE de nível superior em DELETE e UPDATE e contam marcadores de parâmetros fora de literais e casts.

Funciona localmente no seu navegador
Esta ferramenta processa todos os dados localmente no seu navegador.
Consulta ou script SQLEsta é apenas uma revisão estática. O VoriTools nunca conecta, executa ou armazena a consulta.

Como revisar um script SQL em busca de gravações inseguras e valores sem binding

A página divide o script colado em instruções e revisa cada uma como texto: a palavra-chave inicial é lida no nível superior, então WITH old AS (...) DELETE FROM users é informado como DELETE, não como SELECT. Nada vira plano de execução e nada é enviado a um banco de dados.

As verificações cobrem o que uma revisão de código costuma olhar primeiro: DELETE e UPDATE sem WHERE na própria instrução, DROP e TRUNCATE, SELECT * e SELECT sem limite de linhas, um literal comparado em um filtro, um 1=1 ou OR TRUE de nível superior, um marcador de template ${...} e um valor montado com concatenação de strings.

  1. Cole uma consulta ou um script completo no painel esquerdo, ou clique em Carregar exemplo para ver um UPDATE e um SELECT.
  2. Clique em Revisar segurança SQL. Comentários, strings e corpos entre $$ são mascarados antes da busca por palavras-chave, então o conteúdo deles não aciona nenhuma regra.
  3. Leia o resumo por instrução: cada instrução aparece com o tipo resolvido pelo analisador, e a que não aciona nada informa isso abaixo do texto.
  4. Leia as métricas — instruções, escrita / DDL, marcadores de parâmetros, itens de revisão — e a lista de achados. Com várias instruções, cada achado indica a qual pertence.
  5. Copie ou baixe o resumo e clique em Limpar. Uma nova revisão substitui a saída anterior; uma entrada vazia ou não revisável limpa os painéis e explica o motivo.

O que esta página verifica e o que ela não consegue ver

O que é informado em cada instrução

São contadas como gravações INSERT, UPDATE, DELETE, MERGE, REPLACE, CREATE, ALTER, DROP e TRUNCATE. Um DELETE ou UPDATE sem WHERE na própria instrução é um achado de perigo: um WHERE dentro de subconsulta não protege a gravação externa. DROP e TRUNCATE são achados de perigo por si sós; as demais gravações são avisos.

Em um SELECT são verificados um asterisco na lista de colunas (incluindo t.*) e um limite de linhas: LIMIT, FETCH FIRST ou NEXT ... ROWS ONLY, TOP n e ROWNUM <= n contam, então a nota informativa de limite ausente só aparece quando o SELECT pode retornar um número ilimitado de linhas.

Literais, marcadores e construção de strings

A contagem de marcadores cobre ?, $1, :name e @name fora de comentários e strings; um cast como created_at::text e um identificador como @@ROWCOUNT não são contados. Um literal comparado em um filtro WHERE, AND ou OR é um aviso que aponta para a sintaxe de parâmetros do seu driver.

Dois padrões de construção de strings são informados separadamente: um marcador de template ${...} indica que um valor é interpolado na instrução, e uma concatenação como literal mais identificador indica que o texto é montado fora do driver. Nenhum dos dois é um parâmetro vinculado, e essa é a diferença que importa para o texto que chega ao servidor.

Scripts, dialetos e limites

O divisor entende aspas duplicadas e escapes com barra invertida do MySQL, identificadores entre aspas duplas e crases, comentários -- e /* */, comentários #, corpos entre $$ do PostgreSQL e diretivas DELIMITER, então um apóstrofo escapado ou um corpo de função não geram contagem falsa. Um script com mais de uma instrução gera um aviso, e cada achado carrega o número da instrução.

A página não se conecta a banco algum, não executa nada e não enxerga seu esquema, permissões, segurança em nível de linha ou transações: uma instrução aprovada aqui ainda pode ser destrutiva no seu ambiente. Trate o resultado como pré-checagem de texto antes de uma revisão, ao lado de EXPLAIN e da leitura do código que gera a consulta.

Ferramentas recentes: