Pular para o conteúdo principal

Questão de Segurança da Informação — Ataques a Aplicações Web (XSS, CSRF, SQL Injection etc.) — FUNDATEC 2026

Segurança da InformaçãoAtaques a Aplicações Web (XSS, CSRF, SQL Injection etc.)
Código
qa429538
Banca
FUNDATEC
Órgão
IFC
Ano
2026
Cargo
PEBTT ( )

Em sistemas web, a integração entre PHP e MySQL utilizando a extensão mysqli permite executar consultas parametrizadas para prevenir ataques de injeção de SQL. Analise o seguinte trecho de código PHP:

 

php
$conn = mysqli_connect("localhost", "root", "senha", "escola");
stmt=mysqliprepare(stmt = mysqli_prepare(conn, "SELECT * FROM alunos WHERE curso = ? AND situacao = ?");
mysqli_stmt_bind_param($stmt, "ss", $curso, $situacao);
$curso = "Informática";
$situacao = "ativo";
mysqli_stmt_execute($stmt);

 

Sobre o assunto, analise as assertivas a seguir:

 

I. A função mysqli_prepare pré-compila a instrução SQL no servidor antes da vinculação dos parâmetros, separando estrutura e dados e impedindo que valores maliciosos alterem a instrução.

 

II. O segundo argumento "ss" da função mysqli_stmt_bind_param indica que ambos os parâmetros são do tipo string, sendo necessário utilizar "ii" caso os parâmetros fossem do tipo inteiro.

 

III. As variáveis $curso e $situacao devem ser obrigatoriamente inicializadas antes da chamada de mysqli_stmt_bind_param para que a vinculação ocorra corretamente.

 

IV. A consulta parametrizada utilizada no código é funcionalmente equivalente a concatenar diretamente os valores das variáveis na string SQL, diferenciando-se apenas pela sintaxe utilizada.

 

Quais estão corretas?

  1. AApenas I e II.
  2. BApenas I e III.
  3. CApenas III e IV.
  4. DApenas I, II e IV.
  5. EApenas I, III e IV.
Revelar gabarito e comentário

GabaritoA — Apenas I e II.

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”.

Consultas parametrizadas e prevenção de SQL Injection no mysqli

Gabarito: letra A — corretas apenas as assertivas I e II. A consulta parametrizada com mysqli_prepare e mysqli_stmt_bind_param separa a estrutura do SQL dos dados, impedindo que valores maliciosos alterem a instrução; o segundo argumento "ss" define os tipos dos parâmetros como string. As assertivas III e IV estão incorretas: a vinculação pode ocorrer antes da atribuição das variáveis (desde que existam), e a parametrização NÃO é funcionalmente equivalente à concatenação — é justamente essa diferença que bloqueia a injeção de SQL.

A injeção de SQL (SQLi) é uma vulnerabilidade de segurança web que permite a um invasor interferir nas consultas que uma aplicação faz ao seu banco de dados. Isso pode permitir que o invasor visualize dados que normalmente não poderia acessar, incluindo informações de outros usuários, ou quaisquer outros dados que a aplicação possa acessar. Em muitos casos, um invasor pode modificar ou deletar esses dados, causando alterações persistentes no conteúdo ou comportamento da aplicação.

As vulnerabilidades que permitem SQLi incluem: dados fornecidos não são validados, filtrados ou higienizados; consultas dinâmicas ou chamadas não parametrizadas sem escape; dados hostis são usados em parâmetros de mapeamento relacional objeto para extrair registros; e dados hostis são usados diretamente ou concatenados. A prevenção central é manter os dados separados de comandos e consultas, usando consultas parametrizadas — exatamente o que o código do enunciado faz.

A extensão mysqli (MySQL Improved) oferece suporte a prepared statements (declarações preparadas). O fluxo é: mysqli_prepare envia o template da consulta ao servidor, que o pré-compila; mysqli_stmt_bind_param vincula as variáveis aos placeholders (?), declarando seus tipos; mysqli_stmt_execute executa a consulta com os valores já vinculados. Como a estrutura SQL já foi definida e compilada antes de os dados chegarem, qualquer tentativa de injeção é tratada como dado, não como comando.

A pegadinha da questão está na assertiva IV: muitos candidatos acham que parametrizar é só "outra sintaxe" para concatenar. Não é. Na concatenação, os valores são embutidos diretamente na string SQL antes da execução, permitindo que um valor como ' OR '1'='1 altere a estrutura da consulta. Na parametrização, os valores são enviados separadamente e o servidor os trata como dados puros — a estrutura já foi fixada na pré-compilação. Essa é a diferença funcional que torna a parametrização segura.

Guarde a fronteira entre pré-compilação da estrutura e vinculação posterior dos dados: é exatamente nela que as assertivas I e IV se separam — a primeira descreve corretamente o mecanismo, a quarta nega a diferença essencial.

  1. 1prepare: pré-compila a estrutura
  2. 2bind_param: vincula variáveis e tipos
  3. 3execute: executa com os valores
LEVEL · soulevel.com.br

Item I — ✅ Correto

A assertiva descreve com precisão o funcionamento de mysqli_prepare: ela pré-compila a instrução SQL no servidor antes da vinculação dos parâmetros, separando estrutura e dados. Isso impede que valores maliciosos alterem a instrução, pois a estrutura já foi fixada. É o mecanismo central de prevenção de SQL Injection.

Item II — ✅ Correto

O segundo argumento "ss" de mysqli_stmt_bind_param indica que ambos os parâmetros são do tipo string. A função usa um caractere por parâmetro: s para string, i para inteiro, d para double, b para blob. Se os parâmetros fossem inteiros, o correto seria "ii". A assertiva está tecnicamente correta.

Item III — ❌ Incorreto

A assertiva afirma que as variáveis devem ser obrigatoriamente inicializadas antes da chamada de mysqli_stmt_bind_param. Na prática, a vinculação é feita por referência: a função associa as variáveis aos placeholders, e os valores são lidos no momento da execução (mysqli_stmt_execute). Portanto, as variáveis podem ser atribuídas após a vinculação, desde que existam e tenham valor antes da execução. O código do enunciado ilustra exatamente isso: mysqli_stmt_bind_param é chamado antes das atribuições de $curso e $situacao, e o código funciona. A palavra "obrigatoriamente" torna a assertiva falsa.

Item IV — ❌ Incorreto

A assertiva afirma que a consulta parametrizada é funcionalmente equivalente a concatenar os valores na string SQL, diferenciando-se apenas pela sintaxe. Isso é falso: a diferença é funcional e de segurança. Na concatenação, os valores são embutidos na string antes da execução, permitindo que dados maliciosos alterem a estrutura da consulta (SQL Injection). Na parametrização, a estrutura é pré-compilada e os valores são enviados separadamente, tratados como dados puros. Não é apenas sintaxe — é um mecanismo de segurança distinto.

NÃO CAIA NESSA!

A banca explora a confusão entre "parametrizar" e "concatenar". O candidato que acha que é só uma questão de sintaxe cai na assertiva IV. Lembre-se: na parametrização, a estrutura é pré-compilada e os dados são vinculados depois — é isso que impede a injeção. Na concatenação, os dados entram na string e podem alterar a estrutura. São funcionalmente diferentes.

PEGA ESSA DICA!

Para questões sobre prepared statements, foque no fluxo: prepare (pré-compila a estrutura) → bind_param (vincula variáveis e tipos) → execute (executa com os valores). A ordem de atribuição das variáveis não importa, desde que existam antes do execute. E lembre-se: a parametrização é a principal defesa contra SQL Injection, pois separa dados de comandos.

Gabarito: letra A — corretas apenas as assertivas I e II.

Link permanente: /questoes/qa429538