Injeção de SQL e consultas parametrizadas
Elimine riscos de injeção usando sempre instruções preparadas com PDO.
Injeção de SQL e consultas parametrizadas é uma aula grátis de PHP Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de PHP Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de PHP Academy inclui 4 aulas no total.
O que é injeção de SQL?
Injeção de SQL ocorre quando dados fornecidos pelo usuário são inseridos diretamente em uma consulta SQL, permitindo que invasores manipulem a consulta para acessar, modificar ou excluir dados.
Exemplo clássico
Concatenar a entrada do usuário em SQL:
<?php
// VULNERABLE: attacker enters username = "' OR '1'='1"
$sql = "SELECT * FROM users WHERE username = '".$_GET["username"]."'";
// Becomes: SELECT * FROM users WHERE username = '' OR '1'='1'
// Returns ALL users!Exemplo de exfiltração de dados
Um invasor usa UNION SELECT para vazar dados de outras tabelas.
// Input: ' UNION SELECT username, password FROM admin_users--
// This appends a second SELECT returning admin credentialsInstruções preparadas são a solução
Com instruções preparadas, a estrutura da consulta é definida antes que qualquer dado seja fornecido. O banco de dados trata todos os valores vinculados como dados literais, nunca como código SQL.
<?php
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$_GET["username"]]);
// Safe even if username = "' OR 1=1--"Marcadores de posição nomeados
Marcadores de posição nomeados são mais claros, especialmente quando há vários parâmetros.
<?php
$stmt = $pdo->prepare(
"SELECT * FROM users WHERE email = :email AND active = :active"
);
$stmt->execute([":email" => $email, ":active" => true]);O Eloquent é seguro por padrão
O Eloquent do Laravel usa internamente instruções preparadas do PDO para todas as operações padrão do construtor de consultas.
<?php
// Safe:
User::where("email", $email)->first();
// UNSAFE: raw query with user input!
DB::select("SELECT * FROM users WHERE email = ".$email);Consultas brutas
Quando precisar usar SQL bruto no Laravel, sempre use vinculação de parâmetros.
<?php
// Safe raw query:
$users = DB::select("SELECT * FROM users WHERE email = ?", [$email]);
// Or with named bindings:
$users = DB::select("SELECT * FROM users WHERE email = :email", [":email" => $email]);Injeção na cláusula LIKE
As cláusulas LIKE exigem um tratamento especial: os caracteres curinga (%, _) precisam ser escapados manualmente antes da vinculação.
<?php
$search = str_replace(["%", "_", "\\"], ["\%", "\_", "\\\\"], $userInput);
$stmt = $pdo->prepare("SELECT * FROM products WHERE name LIKE ?");
$stmt->execute(["%$search%"]);Injeção em ORDER BY
Nomes de colunas e direções de ORDER BY não podem ser parametrizados. Valide-os em relação a uma lista de permissões.
<?php
$allowedColumns = ["name", "price", "created_at"];
$col = in_array($request->sort, $allowedColumns) ? $request->sort : "name";
$dir = $request->dir === "desc" ? "desc" : "asc";
// Then safely build the query stringProcedimentos armazenados
Os procedimentos armazenados também podem ser vulneráveis se concatenarem a entrada internamente. Sempre use chamadas parametrizadas.
Princípio do menor privilégio
O usuário do banco de dados que se conecta a partir do PHP deve ter apenas SELECT/INSERT/UPDATE/DELETE nas tabelas necessárias, nunca privilégios de CREATE, DROP ou de administrador.
Resumo
ALWAYS use instruções preparadas com parâmetros vinculados. Nunca concatene a entrada do usuário em SQL. Valide ORDER BY e os nomes de colunas em relação a uma lista de permissões. Use PDO com as preparações emuladas desativadas.
Verificação rápida
Qual é a maneira correta de se proteger contra injeção de SQL?
Perguntas Frequentes
A aula “Injeção de SQL e consultas parametrizadas” é grátis?
Sim — o texto completo de “Injeção de SQL e consultas parametrizadas” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de PHP Academy, atualize para CoddyKit PRO. O curso de PHP Academy inclui 4 aulas no total.
O que vou aprender em “Injeção de SQL e consultas parametrizadas”?
Elimine riscos de injeção usando sempre instruções preparadas com PDO. Você pratica PHP Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar PHP Academy?
Nenhuma experiência prévia é necessária. PHP Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “Injeção de SQL e consultas parametrizadas”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de PHP Academy?
Sim. Cada aula de PHP Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Prevenção de Cross-Site Scripting (XSS)
- Injeção de SQL e consultas parametrizadas
- Proteção contra CSRF
- Armazenamento seguro de senhas