Pular para o conteúdo principal

Questão de Programação — Web — FUNDATEC 2026

ProgramaçãoWeb
Código
qg685901
Banca
FUNDATEC
Órgão
IFC-SC
Ano
2026
Nível
Superior
Cargo
Professor EBTT - Informática: Banco de Dados
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:Imagem associada para resolução da questãoSobre 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 com mysqli em PHP

Gabarito: letra A — corretas apenas as assertivas I e II. A função mysqli_prepare realmente pré-compila a instrução SQL separando estrutura de dados (I correta), e o segundo argumento "ss" de mysqli_stmt_bind_param indica que ambos os parâmetros são strings, sendo "ii" o correto para inteiros (II correta). As assertivas III e IV estão incorretas: as variáveis não precisam ser inicializadas antes da vinculação (III falsa), e a consulta parametrizada NÃO é funcionalmente equivalente à concatenação direta, pois é justamente essa separação que previne injeção de SQL (IV falsa).

A injeção de SQL é uma das vulnerabilidades mais exploradas em aplicações web. Ela ocorre quando dados fornecidos pelo usuário são concatenados diretamente em uma instrução SQL, permitindo que o atacante altere a estrutura da consulta. Por exemplo, se um campo de login recebe ' OR '1'='1, a concatenação direta transformaria a consulta em algo como SELECT * FROM usuarios WHERE login = '' OR '1'='1', que retornaria todos os usuários. A consulta parametrizada resolve esse problema ao separar a estrutura da instrução dos dados: o SQL é enviado ao banco com placeholders (?), e os valores são vinculados posteriormente, de modo que o banco os trata como dados puros, nunca como parte da instrução.

A extensão mysqli (MySQL Improved) oferece suporte a prepared statements, que funcionam em duas etapas. Primeiro, mysqli_prepare envia a instrução SQL com placeholders ao servidor MySQL, que a pré-compila — ou seja, analisa a sintaxe e prepara um plano de execução. Em seguida, mysqli_stmt_bind_param vincula as variáveis PHP aos placeholders, especificando o tipo de cada uma por meio de uma string de tipos. Por fim, mysqli_stmt_execute executa a instrução com os valores já vinculados. Esse processo garante que os dados sejam tratados como valores, não como código SQL.

A string de tipos em mysqli_stmt_bind_param é um detalhe crucial: cada caractere corresponde a um parâmetro, na ordem. Os tipos mais comuns são i (integer), d (double), s (string) e b (blob). Se o tipo informado não corresponder ao tipo real da variável, o PHP pode converter o valor automaticamente, mas isso pode causar erros ou comportamentos inesperados. Por isso, é essencial usar o tipo correto para cada parâmetro.

Sobre a inicialização das variáveis: em PHP, variáveis não inicializadas têm valor null por padrão (dependendo da configuração de error_reporting, podem gerar avisos, mas não impedem a execução). No contexto de mysqli_stmt_bind_param, as variáveis são passadas por referência, e o PHP as vincula aos placeholders. Se a variável não foi inicializada, ela será null, e o valor null será enviado ao banco. Isso pode não ser o comportamento desejado, mas não impede a vinculação. Portanto, a assertiva III, que afirma que a inicialização é obrigatória, está incorreta.

A assertiva IV é a mais traiçoeira. Ela afirma que a consulta parametrizada é funcionalmente equivalente à concatenação direta, diferenciando-se apenas pela sintaxe. Isso é falso: a diferença não é apenas sintática, mas semântica e de segurança. Na concatenação, os valores são interpretados como parte da instrução SQL; na parametrização, são tratados como dados. Essa distinção é o que impede a injeção de SQL. Um atacante que tente inserir ' OR '1'='1 em um parâmetro vinculado verá esse valor tratado como uma string literal, não como parte da consulta.

NÃO CAIA NESSA!

A banca explora a confusão entre "funcionalmente equivalente" e "sintaticamente diferente". A assertiva IV parece plausível para quem não entende a diferença entre concatenar e parametrizar. Lembre-se: a parametrização não é apenas uma forma diferente de escrever a mesma coisa — ela muda o significado dos dados, tratando-os como valores, não como código. Essa é a essência da prevenção de injeção de SQL.

Assertiva

Veredito

Justificativa

I. mysqli_prepare pré-compila a instrução SQL, separando estrutura e dados

✅ Correta

O servidor MySQL analisa e prepara a consulta com placeholders, impedindo que valores alterem a estrutura.

II. "ss" indica dois parâmetros string; "ii" seria usado para inteiros

✅ Correta

A string de tipos em mysqli_stmt_bind_param usa s para string e i para inteiro, na ordem dos parâmetros.

III. Variáveis devem ser obrigatoriamente inicializadas antes da vinculação

❌ Incorreta

Em PHP, variáveis não inicializadas assumem null; a vinculação funciona, embora a inicialização seja boa prática.

IV. Consulta parametrizada é funcionalmente equivalente à concatenação direta

❌ Incorreta

A parametrização trata os dados como valores puros, prevenindo injeção de SQL; a concatenação os interpreta como código.

  1. 1mysqli_prepare
  2. 2mysqli_stmt_bind_param
  3. 3mysqli_stmt_execute
LEVEL · soulevel.com.br

Item I — ✅ Correto

A assertiva I está correta. mysqli_prepare envia a instrução SQL ao servidor MySQL, que a pré-compila, separando a estrutura (o texto da consulta) dos dados (os placeholders). Isso impede que valores maliciosos alterem a instrução, pois os dados são vinculados posteriormente como valores, não como parte do SQL. Esse é o princípio fundamental dos prepared statements.

Item II — ✅ Correto

A assertiva II está correta. O segundo argumento de mysqli_stmt_bind_param é uma string onde cada caractere indica o tipo do parâmetro correspondente. "ss" significa que ambos os parâmetros são strings (s = string). Para parâmetros inteiros, o caractere correto é i (integer), portanto "ii" seria usado. Essa é a sintaxe padrão da função.

Item III — ❌ Incorreto

A assertiva III está incorreta. As variáveis $curso e $situacao não precisam ser obrigatoriamente inicializadas antes da chamada de mysqli_stmt_bind_param. Em PHP, variáveis não inicializadas têm valor null, e esse valor será vinculado ao parâmetro. Embora seja uma boa prática inicializar as variáveis para evitar avisos e garantir valores esperados, não é um requisito para que a vinculação ocorra. A função funciona mesmo com variáveis não inicializadas.

Item IV — ❌ Incorreto

A assertiva IV está incorreta. A consulta parametrizada NÃO é funcionalmente equivalente à concatenação direta. A diferença não é apenas sintática: na concatenação, os valores são interpretados como parte da instrução SQL, permitindo injeção de SQL; na parametrização, os valores são tratados como dados puros, impedindo que alterem a estrutura da consulta. Essa é a diferença fundamental de segurança entre as duas abordagens.

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

Link permanente: /questoes/qg685901