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: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?
AApenas I e II.
BApenas I e III.
CApenas III e IV.
DApenas I, II e IV.
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.
1mysqli_prepare
2mysqli_stmt_bind_param
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.