Pular para o conteúdo principal

Questão de Banco de Dados — SQL — FCC 2017

Banco de DadosSQL
Código
fc037978
Banca
FCC
Órgão
TRE-PR
Ano
2017
Nível
Médio
Cargo
Técnico Judiciário - Programação de Sistemas
Considere a situação em que um usuário é solicitado a inserir o nome de uma cidade através de um formulário em uma aplicação web. Se ele inserir a cidade 'Curitiba', a consulta SQL criada pelo script será:SELECT * FROM EleicoesTable WHERE City = 'Curitiba'No entanto, suponha que o usuário insira o seguinte:'Curitiba'; drop table EleicoesTable--Nesse caso, a seguinte consulta SQL é gerada pelo script:SELECT * FROM EleicoesTable WHERE City = 'Curitiba';drop table EleicoesTable--Considerando que o ponto-e-vírgula (;) denota o término de uma consulta e o início de outra e que o hífen duplo (--) indica que o restante da linha atual é um comentário e deve ser ignorado, é correto afirmar:
  1. AComo o código injetado está sintaticamente incorreto, não será executado pelo servidor de banco de dados.
  2. BMesmo que o código SQL injetado esteja sintaticamente correto, a violação será detectada programaticamente.
  3. CÉ responsabilidade do servidor de banco de dados validar todas as entradas de usuário e verificar o código que executa comandos SQL.
  4. DQuando essa instrução for executada, o Banco de Dados selecionará primeiro todos os registros em EleicoesTable onde City é Curitiba e, em seguida, descartará EleicoesTable.
  5. EEste é um exemplo de como uma aplicação web pode dar liberdade ao usuário de atualizar dados em uma base de dados, mas somente os programadores, que conhecem os nomes e campos das tabelas, conseguem fazer isso.
Revelar gabarito e comentário

GabaritoD — Quando essa instrução for executada, o Banco de Dados selecionará primeiro todos os registros em EleicoesTable onde City é Curitiba e, em seguida, descartará EleicoesTable.

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

SQL Injection

Gabarito: letra D. A injeção de SQL apresentada é sintaticamente correta: o ponto-e-vírgula finaliza a primeira consulta (SELECT) e inicia a segunda (DROP TABLE), sendo que o hífen duplo comenta o restante (a aspa simples final que sobraria). Portanto, ambas as instruções serão executadas pelo servidor — primeiro a seleção, depois a exclusão da tabela.

  1. 1Entrada maliciosaUsuário insere 'Curitiba'; drop table EleicoesTable--
  2. 2Consulta montadaSELECT ... WHERE City = 'Curitiba'; drop table EleicoesTable--
  3. 3SELECT executadoRetorna registros de City = Curitiba
  4. 4DROP executadoTabela EleicoesTable é excluída
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

O código injetado está sintaticamente correto. A string '; drop table EleicoesTable-- forma duas instruções SQL válidas: a primeira finaliza o SELECT com a condição City = 'Curitiba' e a segunda é um comando DROP perfeitamente aceito pelo banco de dados.

Alternativa B — ❌ Incorreta

Não há detecção programática automática no cenário descrito. A aplicação monta a consulta diretamente com a entrada do usuário, sem qualquer validação ou sanitização. Se o código for sintaticamente correto, o servidor o executará sem rejeitá-lo.

Alternativa C — ❌ Incorreta

A responsabilidade de validar entradas de usuário é da aplicação web, não do servidor de banco de dados. O servidor apenas executa as instruções SQL que recebe; cabe ao desenvolvedor do sistema evitar a injeção por meio de técnicas como prepared statements ou escape de caracteres.

Alternativa D — ✅ Correta ⟵ GABARITO

Exatamente o que ocorre: o primeiro comando SELECT * FROM EleicoesTable WHERE City = 'Curitiba'; é executado e retorna os registros; em seguida, o comando drop table EleicoesTable-- é executado, destruindo a tabela. O -- faz com que o restante da linha (a aspa simples final) seja ignorado como comentário, evitando erro de sintaxe.

Alternativa E — ❌ Incorreta

O exemplo ilustra justamente o oposto: um atacante pode injetar comandos SQL maliciosos sem conhecer previamente os nomes das tabelas (neste caso, o nome EleicoesTable foi obtido por tentativa ou por vazamento anterior). A vulnerabilidade permite a qualquer usuário, e não apenas programadores, executar comandos arbitrários.

Gabarito: letra D.

Link permanente: /questoes/fc037978